Native BottomNavigationBar behaviour

Hey, great job with the library, I'm just having a few issues implementing a bottom navigation bar. I saw the VNested example which was very helpful however it doesn't really behave like a native UITabBarController.
Here's an example project I did without VRouter, which illustrates the behaviour I'm looking for.
https://github.com/mikebryant71/flutter_navigation
These are the issues I'm having with VRouter:
Issue 1
Expected: When you push a route on the first tab, switch to another tab and then return to the first tab. It should display the pushed route on the first tab.
Current: It doesn't restore the pushed route path on the first tab when returning to it.
onTap: (int index) {
   // We can access this username via the local path parameters (stored in VRouteElement)
   final username = VRouter.of(context).pathParameters['username']!;
   if (index == 0) {
     ConnectedRoutes.toProfile(context, username);
   } else {
     ConnectedRoutes.toSettings(context, username);
   }
 }

Question: Do we need to keep track of the current route for each tab manually? And then restore it back here?
if (index == 0) {
     VRouter.of(context).push(currentProfileRoute) // ex: '/profile/detail/update'
} else  {
     VRouter.of(context).push(currentSettingsRoute) // ex: '/settings/notifications'
}

Issue 2
Expected: When changing tab it doesn't animate and will restore the tab to the state it was in previously without rebuilding.
Current: When changing tab it pushes a new route and animates, it also rebuilds that tab.
By disabling the animation you can get it to feel more native, however it still rebuilds the tab when you navigate to it which isn't generally what you'd want for a mobile app.
Question: Is it possible to achieve this kind of behaviour with VRouter, if so, would you be able to point me in the right direction?
Not really a question, more a comment but I noticed a few others were having trouble distinguishing the difference between nested and stacked routes as I was trying to understand it myself. I think I've understood it now. I think it would be helpful though for newcomers to give an example or two of when you would want to use a stacked route vs a nested route and vice versa.

Issue 1
This is because push in VRouter is not like push in Navigator 1.
All push does it navigate to a new route.
With this is mind, what you would need is to navigate to the same url you where before for that particular tab. This is something related to state so not built in VRouter (VRouter is routing, not state). What you can do however is handle this statefull thing yourself. It's quite easy, here is an example: https://gist.github.com/lulupointu/053954aa66880e26fd9a01ad65a41ef0
The important part of the gist is the tabsLastPath in your statefull widget.
Issue 2
Part 1: The animations
The animations are controlled by the Page that you use. When using VWidget, you implicitly use MaterialPage or CupertinoPage (depending on the OS).
However you can easily customize the animations, here is a link on how to do just that: https://vrouter.dev/guide/Examples/Transitions
Part 2: The state
As mentioned in issue 1, vrouter does not handle the state. This should be done by you using any state management thingy you want.
If what you need is simple enough, you can use VRouter with IndexedTabs, though it's not ideal if you have a stack on top of you indexedTabs, would might have to get creative.

Here is the basic concept

import 'package:flutter/material.dart';
import 'package:vrouter/vrouter.dart';

main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return VRouter(
      routes: [
        VWidget(
          key: ValueKey('MainScreen'),
          path: '/',
          widget: MainScreen(index: 0),
        ),
        VWidget(
          key: ValueKey('MainScreen'),
          path: '/settings',
          widget: MainScreen(index: 1),
        ),
      ],
    );
  }
}

class MainScreen extends StatelessWidget {
  final int index;

  const MainScreen({required this.index});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: IndexedStack(
        index: index,
        children: [
          Align(alignment: Alignment.centerLeft, child: MainWidget('HOME')),
          Align(alignment: Alignment.centerRight, child: MainWidget('SETTINGS')),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => context.vRouter.push(index == 0 ? '/settings' : '/'),
      ),
    );
  }
}

class MainWidget extends StatefulWidget {
  final String title;

  const MainWidget(this.title);

  @override
  _MainWidgetState createState() => _MainWidgetState();
}

class _MainWidgetState extends State<MainWidget> {
  var isChecked = false;

  @override
  Widget build(BuildContext context) {
    return IntrinsicWidth(
      child: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(widget.title, style: TextStyle(fontSize: 20)),
            Checkbox(
                value: isChecked, onChanged: (_) => setState(() => isChecked = !isChecked))
          ],
        ),
      ),
    );
  }
}

Comment on stacked vs nested routes
I know this can be an issue to understand at first this is why this is well documented. But I hear you and I might add:

A section on vrouter.dev
An example on vrouter.dev

I don't have much time right now but when I do I will, thanks for the critique

Thanks for the quick reply. I've been looking at this today and yeah it seems pretty hard to achieve as it is.
I liked the "Basic Concept" snippet you posted and was able to get it to work nicely with that but when you add a stacked route like you were saying it does pushes the route over the bottom tabs.
I also tried to use a VNester instead which worked better, pushing the routes above the tabs but animation returns once you've pushed a child route on a tab (as it doesn't have the same Key)
https://streamable.com/myry0i
I tried to get around this by removing the transition manually (not sure if that's the right way):
 transitionDuration: Duration.zero,
 buildTransition: (animation, secondaryAnimation, child) => child,

This caused issues internally though when I change tabs

This was the code used in the video

import 'package:flutter/material.dart';
import 'package:vrouter/vrouter.dart';

void main() {
  runApp(
    AppContainer(
      child: VRouter(
        debugShowCheckedModeBanner: false,
        routes: [
          VNester(
            path: '/',
            widgetBuilder: (child) =>
                MyScaffold(child), // Child is the widget from nestedRoutes
            nestedRoutes: [
              VWidget(
                  key: ValueKey('MainScreen'),
                  path: null,
                  stackedRoutes: [
                    VWidget(
                        path: 'child',
                        widget: Container(
                            color: Colors.white,
                            child: Center(child: Text('Child widget'))))
                  ],
                  widget: MainScreen(
                    index: 0,
                  )), // null path matches parent
              VWidget(
                key: ValueKey('MainScreen'),
                path: 'settings',
                widget: MainScreen(
                  index: 1,
                ),
                stackedRoutes: [
                  VWidget(
                      path: 'child',
                      widget: Container(
                          color: Colors.red,
                          child: Center(child: Text('test'))))
                ],
              ),
            ],
          ),
        ],
      ),
    ),
  );
}

abstract class BaseWidget extends StatelessWidget {
  String get title;

  String get buttonText;

  String get pushTo;

  @override
  Widget build(BuildContext context) {
    return Material(
      child: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text(title),
            SizedBox(height: 50),
            ElevatedButton(
              onPressed: () => context.vRouter.push(pushTo),
              child: Text(buttonText),
            ),
            ElevatedButton(
              onPressed: () {
                context.vRouter.push(
                    (pushTo == '/settings') ? '/child' : '/settings/child');
                if (pushTo == '/settings') {
                  AppContainer.lastHomePath = '/child';
                }
              },
              child: Text('Push to child'),
            ),
          ],
        ),
      ),
    );
  }
}

class MyScaffold extends StatelessWidget {
  final Widget child;

  const MyScaffold(this.child);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: child,
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: context.vRouter.url!.contains('settings') ? 1 : 0,
        onTap: (value) => context.vRouter
            .push((value == 0) ? AppContainer.lastHomePath : '/settings'),
        items: [
          BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'),
          BottomNavigationBarItem(
              icon: Icon(Icons.settings), label: 'Settings'),
        ],
      ),
    );
  }
}

class HomeScreen extends BaseWidget {
  @override
  String get title => 'Home';

  @override
  String get buttonText => 'Go to Settings';

  @override
  String get pushTo => '/settings';
}

class SettingsScreen extends BaseWidget {
  @override
  String get title => 'Settings';

  @override
  String get buttonText => 'Go to Home';

  @override
  String get pushTo => '/';
}

class MainScreen extends StatelessWidget {
  final int index;

  const MainScreen({required this.index});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: IndexedStack(
        index: index,
        children: [HomeScreen(), SettingsScreen()],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => context.vRouter.push(index == 0 ? '/settings' : '/'),
      ),
    );
  }
}

class MainWidget extends StatefulWidget {
  final String title;

  const MainWidget(this.title);

  @override
  _MainWidgetState createState() => _MainWidgetState();
}

class _MainWidgetState extends State<MainWidget> {
  var isChecked = false;

  @override
  Widget build(BuildContext context) {
    return IntrinsicWidth(
      child: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(widget.title, style: TextStyle(fontSize: 20)),
            Checkbox(
                value: isChecked,
                onChanged: (_) => setState(() => isChecked = !isChecked))
          ],
        ),
      ),
    );
  }
}

class AppContainer extends StatelessWidget {
  final Widget child;
  static var lastHomePath = '/';

  AppContainer({Key? key, required this.child}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return child;
  }
}

\```

</p>
</details>

It seems like a Duration.zero transition is too short. But you can decrease it close to zero to achieve the same effect:
 transitionDuration: Duration.zero,
 buildTransition: (animation, secondaryAnimation, child) => child,

Btw, the is the right way to disable every animations.
If you want transition between pages to play/not play, then (you are right again) you should use key

Yeah unfortunately you can't use the same key for the "stacked routes" so only way is to remove the transition as far as I can tell.
This means you also lose the swipe to pop which is a shame and it would also be quite difficult to only have the animation when you push the route on the tab but not when switching tabs as from VRouter's pov it's the same thing context.vRouter.push().

I'm happy to say I managed to make something work.
The trick is that what you want is a custom page behavior so you should create your own page.
Basically the page I created is just done by copy pasting everything from flutter CupertinoPage but changing the transitionDuration to depend on where you come from.
Also note that I override reverseTransitionDuration, this is needed because it defaults to transitionDuration and this is not what we want, we always want reverseTransitionDuration to be the same.
Here is the implementation (extended from the gist I sent you earlier):
import 'dart:math';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:vrouter/vrouter.dart';

class Book {
  final String title;
  final String author;

  Book(this.title, this.author);
}

main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final List<String> tabsLastPath = [BooksRoutes.defaultPath, ProfileRoutes.defaultPath];

  @override
  Widget build(BuildContext context) {
    return VRouter(
      initialUrl: BooksRoutes.defaultPath,
      routes: [
        VNester(
          path: null,
          widgetBuilder: (child) =>
              ScaffoldScreen(child: child, initialTabsLastPath: tabsLastPath),
          nestedRoutes: [
            VGuard(
              afterEnter: (context, from, to) => tabsLastPath[0] = to,
              afterUpdate: (context, from, to) => tabsLastPath[0] = to,
              stackedRoutes: [BooksRoutes()],
            ),
            VGuard(
              afterEnter: (context, from, to) => tabsLastPath[1] = to,
              afterUpdate: (context, from, to) => tabsLastPath[1] = to,
              stackedRoutes: [ProfileRoutes()],
            ),
          ],
        ),
      ],
    );
  }
}

class BooksRoutes extends VRouteElementBuilder {
  static final _books = '/books';
  static final _book = _books + '/:bookId';

  static void toBooks(BuildContext context) => context.vRouter.push(_books);

  static void toBook(BuildContext context, {required Book book}) =>
      context.vRouter.pushSegments(['books', book.title]);

  static final List<Book> books = [
    Book('Stranger in a Strange Land', 'Robert A. Heinlein'),
    Book('Foundation', 'Isaac Asimov'),
    Book('Fahrenheit 451', 'Ray Bradbury'),
  ];

  static final name = 'books';

  static final defaultPath = _books;

  @override
  List<VRouteElement> buildRoutes() => [
        VWidget(
          path: _books,
          name: name,
          transitionDuration: Duration(milliseconds: 10),
          buildTransition: (_, __, child) => child,
          widget: BooksScreen(books),
          stackedRoutes: [
            VPage(
              pageBuilder: (LocalKey key, Widget child, String? name) =>
                  AnimationAdaptedCupertinoPage(
                name: name,
                child: child,
                key: key,
                transitionDurationBuilder: (BuildContext context) => Duration(
                  milliseconds: context.vRouter.previousUrl == _books ? 300 : 10,
                ),
              ),
              path: _book,
              widget: Builder(
                builder: (context) {
                  final book = books.firstWhere(
                      (book) => book.title == context.vRouter.pathParameters['bookId']);
                  return BookScreen(book);
                },
              ),
            ),
          ],
        ),
      ];
}

class ProfileRoutes extends VRouteElementBuilder {
  static final _profile = '/profile';
  static final _settings = _profile + '/settings';

  static void toProfile(BuildContext context) => context.vRouter.push(_profile);

  static void toSettings(BuildContext context) => context.vRouter.push(_settings);

  static final name = 'profile';

  static final defaultPath = _profile;

  @override
  List<VRouteElement> buildRoutes() => [
        VWidget(
          path: _profile,
          name: name,
          transitionDuration: Duration(milliseconds: 10),
          buildTransition: (_, __, child) => child,
          widget: ProfileScreen(),
          stackedRoutes: [
            VPage(
              pageBuilder: (LocalKey key, Widget child, String? name) =>
                  AnimationAdaptedCupertinoPage(
                name: name,
                child: child,
                key: key,
                transitionDurationBuilder: (BuildContext context) => Duration(
                  milliseconds: context.vRouter.previousUrl == _profile ? 300 : 10,
                ),
              ),
              path: _settings,
              widget: SettingsScreen(),
            ),
          ],
        ),
      ];
}

class ScaffoldScreen extends StatefulWidget {
  final Widget child;
  final List<String> initialTabsLastPath;

  const ScaffoldScreen({
    Key? key,
    required this.child,
    required this.initialTabsLastPath,
  }) : super(key: key);

  @override
  _ScaffoldScreenState createState() =>
      _ScaffoldScreenState(initialTabsLastPath: initialTabsLastPath);
}

class _ScaffoldScreenState extends State<ScaffoldScreen> {
  List<String> tabsLastPath;

  _ScaffoldScreenState({required List<String> initialTabsLastPath})
      : tabsLastPath = initialTabsLastPath;

  @override
  Widget build(BuildContext context) {
    final index = context.vRouter.names.contains(BooksRoutes.name) ? 0 : 1;
    return Scaffold(
      body: widget.child,
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: index,
        onTap: (value) => context.vRouter.push(tabsLastPath[value]),
        items: [
          BottomNavigationBarItem(icon: Icon(Icons.book), label: 'books'),
          BottomNavigationBarItem(icon: Icon(Icons.person), label: 'settings'),
        ],
      ),
    );
  }
}

class BooksScreen extends StatelessWidget {
  final List<Book> books;

  const BooksScreen(this.books);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Books')),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: ListView(
          children: [
            for (var book in books)
              ListTile(
                title: Text(book.title),
                subtitle: Text(book.author),
                onTap: () => BooksRoutes.toBook(context, book: book),
              )
          ],
        ),
      ),
    );
  }
}

class BookScreen extends StatelessWidget {
  final Book book;

  const BookScreen(this.book);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Book')),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(
              book.title,
              style: Theme.of(context).textTheme.headline6,
            ),
            Text(
              book.author,
              style: Theme.of(context).textTheme.subtitle1,
            ),
          ],
        ),
      ),
    );
  }
}

class ProfileScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Profile')),
      body: Padding(
        padding: const EdgeInsets.all(80.0),
        child: Column(
          mainAxisSize: MainAxisSize.max,
          children: [
            Expanded(
              child: Center(
                child: Text('This is your profile, you can navigate to your settings'),
              ),
            ),
            ElevatedButton(
              onPressed: () => ProfileRoutes.toSettings(context),
              child: Text(
                'Go to settings',
              ),
            ),
          ],
        ),
      ),
    );
  }
}

class SettingsScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Settings')),
      body: Padding(
        padding: const EdgeInsets.all(80.0),
        child: Column(
          children: [
            Expanded(
              child: Center(
                child: Text(
                    'Here are your settings, you can use the button bellow to access a random book'),
              ),
            ),
            ElevatedButton(
              onPressed: () => BooksRoutes.toBook(
                context,
                book: BooksRoutes.books[Random().nextInt(BooksRoutes.books.length)],
              ),
              child: Text(
                'Go to a random book',
              ),
            ),
          ],
        ),
      ),
    );
  }
}

class AnimationAdaptedCupertinoPage extends CupertinoPage {
  final Widget child;
  final String? name;
  final LocalKey key;
  final Duration Function(BuildContext) transitionDurationBuilder;

  AnimationAdaptedCupertinoPage({
    required this.child,
    required this.name,
    required this.key,
    required this.transitionDurationBuilder,
  }) : super(
          child: child,
          name: name,
          key: key,
        );

  @override
  Route createRoute(BuildContext context) {
    return PageBasedCupertinoPageRoute(
      page: this,
      transitionDuration: transitionDurationBuilder(context),
    );
  }
}

class PageBasedCupertinoPageRoute<T> extends PageRoute<T>
    with CupertinoRouteTransitionMixin<T> {
  PageBasedCupertinoPageRoute({
    required CupertinoPage<T> page,
    required this.transitionDuration,
  }) : super(settings: page) {
    assert(opaque);
  }

  @override
  Duration transitionDuration;

  @override
  Duration get reverseTransitionDuration => Duration(milliseconds: 400);

  CupertinoPage<T> get _page => settings as CupertinoPage<T>;

  @override
  Widget buildContent(BuildContext context) => _page.child;

  @override
  String? get title => _page.title;

  @override
  bool get maintainState => _page.maintainState;

  @override
  bool get fullscreenDialog => _page.fullscreenDialog;

  @override
  String get debugLabel => '${super.debugLabel}(${_page.name})';
}

Note that the same process could be applied to MaterialPage and you could perform a platform check to know which to use.

Cool that works pretty nicely. I'm currently looking into what I can do about the other two issues.

With VNester using Key trick doesn't work for "caching" the screens when changing tabs.
Trying to use standard animation when pushing and popping as it looks a bit strange the way it pops due to removing the transition for all cases buildTransition: (_, __, child) => child,

For caching I have not find any solution myself so if you find one please let me know ^^
For the animations in my example I did not remove every single one, just the one we did not need. So I don't understand the issue

Will do!
The issue I was describing with the animation is this:
Current: https://streamable.com/xn1wv6
Expected: https://streamable.com/uvduib
Notice the previous screen does not animate when swiping to pop.

Oh you are right, this is unexpected. I'll have a look into it when I have time.

I'm sorry but when I use VPage and put a cupertinoPage everywhere I can't reproduce the issue. When you are on an emulator you are on IOS right ?

Oh actually I know why! This is because I use:
transitionDuration: Duration(milliseconds: 10),
buildTransition: (_, __, child) => child,

which effectively uses a custom page instead of a CupertinoPage. This is because CupertinoPage don't allow us to change the transition duration by default so you have to use a custom page (which is what buildTransition: (_, __, child) => child, implies).
I'll see if I can modify CupertinoPage by implementing the route myself in order to pass the transition duration down. I'll keep you updated but do expect this to take a week since I'm quite busy atm.

Hey, I just "fixed" that in v1.1.4+16.
So now you can change the speed of the animation while keeping a CupertinoRoute. You just have to use the same code as before, just remove every buildTransition: (_, __, child) => child,.
Have a look and let me know how that goes :wink:

I am closing this for now, feel free to reopen if you notice any issue with the last change I recommended.


Strings are coming through encoded

Using the the latest version of the library (1.9.1), any string that contains certain characters (like apostrophes) are returned with encoding.
For example
Dean's house becomes Dean's house
This seems to affect all free-text fields: player names, locations, color, comments (both in collection results and play logs).
Can strings please come through as they were written on BGG? Going directly to the API has them come through correctly, e.g. https://api.geekdo.com/xmlapi2/plays?username=Hammerstrike

@LearningProcesss this feels like it should be a quick fix? Do you have an ETA? If not I will have to make some corrections on my end because I have just had my second user affected by this problem.

Hey @LearningProcesss, sorry to be annoying on this one. I saw there was a branch for this with the fix 11 days ago but no change since then, is it close to being merged in?

Hey @LearningProcesss , just checking everything is okay? Been a while since we've heard from you!


add TLS1.3 support

Adding TLS1.3 option in go-curl

@andelf are you the current maintainer for go-curl ? Please review this simple PR.

Thanks. :)

It's not as that simple.
backward compatibility should be maintained.

It's not as that simple.
backward compatibility should be maintained.

could you explain why adding TLS1.3 breaks backward compatibility ? and what's best why to get TLS1.3 support ?

It's been a long time(years) since I last edited these codes(actually wrote code in golang). I will deal with the feature requests / PRs this weekend.
It might be solved by  compatgen.py & compat.h.

This repo seems to support from curl 7.10.1, which is very old.

@andelf do you plan to actively maintain this repo ? I'm looking at it if I can use it in our service, but we need it to support new version of curl.

I haven't written any golang code for years. :)
The maintain status might be terrible now.
To actively maintain the repo, first, I need to look into the historical code generating tools.
I will resolve your issue this weekend.
The latest libcurl version update in this repo is 7.51.0, in 2016.
The latest libcurl version is 7.71.0.


tsm-client: <IP_ADDRESS> -> <IP_ADDRESS>

Description of changes
IBM's "Authorized Program Analysis Report"s (something like release notes): https://www.ibm.com/support/pages/node/6845804
README: https://www.ibm.com/support/pages/node/617857#8117Readme
Security Bulletin: https://www.ibm.com/support/pages/node/6842073 (CVE-2022-34165, CVE-2022-42003, CVE-2022-42004, CVE-2021-33813, CVE-2018-25032)
Note that the old download link structure no longer works.  Also the security bulletins seem to be no longer public.  Luckily, there is a new download link -- time will tell if further updates are also published there.  Until then, I just put the verbatim download URL in the url field.  Details are in the commit message.  The new version is in the usual place again.
Both test derivations still build fine.  I also tested the client with the tsm-backup nixos module and a real TSM server and file upload worked fine.
Things done

Built on platform(s)

[x] x86_64-linux
[ ] aarch64-linux
[ ] x86_64-darwin
[ ] aarch64-darwin

[ ] For non-Linux: Is sandbox = true set in nix.conf? (See Nix manual)
[x] Tested, as applicable:

NixOS test(s) (look inside nixos/tests)
and/or package tests
or, for functions and "core" functionality, tests in lib/tests or pkgs/test
made sure NixOS tests are linked to the relevant packages

[x] Tested compilation of all packages that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review rev HEAD". Note: all changes have to be committed, also see nixpkgs-review usage
[ ] Tested basic functionality of all binary files (usually in ./result/bin/)
23.05 Release Notes (or backporting 22.11 Release notes)

[ ] (Package updates) Added a release notes entry if the change is major or breaking
[ ] (Module updates) Added a release notes entry if the change is significant
[ ] (Module addition) Added a release notes entry if adding a new NixOS module
[ ] (Release notes changes) Ran nixos/doc/manual/md-to-db.sh to update generated release notes

[x] Fits CONTRIBUTING.md.

Result of nixpkgs-review run on x86_64-linux 1

2 packages built:

tsm-client
tsm-client-withGui

When IBM updated their tsm-client distribution yesterday, they missed to publish the archive at the usual place.  Due to other changes, I assumed that IBM is permanently moving their archives and adapted the build recipe accordingly.  However, the archive also appeared at the usual place, so I reverted those changes and replaced them with a simple version update.
The pull request text is updated.

This pull request has been mentioned on NixOS Discourse. There might be relevant details there:
https://discourse.nixos.org/t/prs-ready-for-review/3032/1538


Feat/main update api docs

Pull Request
Description
This PR is part of updating the Quartz Solar API docs so they are clear. This is part of a series of PRs. This one is for the route descriptions in main.py and status.py.
For easier reading and review, below are screenshots of the sections of text.
This the General Overview:

This is a note on PV_Live:

This is the section on Key Terms and Example Use Cases:

Git Status:

Fixes #219
How Has This Been Tested?
Code was run locally.

[x] Yes

Checklist:

[x] My code follows OCF's coding style guidelines
[x] I have performed a self-review of my own code
[ ] I have made corresponding changes to the documentation
[ ] I have added tests that prove my fix is effective or that my feature works
[ ] I have checked my code and corrected any misspellings

Great stuff @rachel-labri-tipton, merge away!


Refactor FeatureEngineer to accept df in preprocess_data()

Implementing the class without the DF parameter will allow this to be re-used in other contexts without being re-initialized.
This could be useful in designing backtesting.

Not understand. But you can try and pull a request, we are happy to include such a feature/function.

Implementing the class without the DF parameter will allow this to be re-used in other contexts without being re-initialized.
This could be useful in designing backtesting.

Thank you so much!! Did you join our slack open community?
https://join.slack.com/t/ai4financeworkspace/shared_invite/zt-jyaottie-hHqU6TdvuhMHHAMXaLw_~w

Implementing the class without the DF parameter will allow this to be re-used in other contexts without being re-initialized.
This could be useful in designing backtesting.

Thank you so much!! Did you join our slack open community?
https://join.slack.com/t/ai4financeworkspace/shared_invite/zt-jyaottie-hHqU6TdvuhMHHAMXaLw_~w

Implementing the class without the DF parameter will allow this to be re-used in other contexts without being re-initialized.
This could be useful in designing backtesting.

Maybe you can join us for our academic research papers in 2021. Our current focus is ICAIF 2021 (target 5 articles) and NeurIPS (Deep RL workshop), I am responsible for at least 2 articles for each conference. FinRL is our DRL framework, we can always refer back to this repo to do the coding for our new papers, we have some research initiatives in our mind for ICAIF 2021:
Research Initiatives:

Portfolio Allocation using DRL;
High-frequency trading using DRL;
Cryptocurrency trading using DRL;
DRL v.s. Human trader;
Live trading using DRL;
Application of RL to Financial Arbitrage;
Explainable DRL in Finance;
Quantum RL in finance;
Multi-Agent RL in Finance;
Closing the simulation-reality gap of DRL in Finance;
SOTA DRL for Finance (checking RLZoo);
Benchmarking DRL performance in Finance;
Lightweight DRL in Finance;
Sequential RL in Finance;
inverse reinforcement learning in Finance;
Hamiltonian reinforcement learning in finance;
Hamilton-Jacobi-Bellman Equations for continuous RL in finance;
Mean Field Multi-Agent Reinforcement Learning in finance;

Implementing the class without the DF parameter will allow this to be re-used in other contexts without being re-initialized.
This could be useful in designing backtesting.

Maybe you can join us for our academic research papers in 2021. Our current focus is ICAIF 2021 (target 5 articles) and NeurIPS (Deep RL workshop), I am responsible for at least 2 articles for each conference. FinRL is our DRL framework, we can always refer back to this repo to do the coding for our new papers, we have some research initiatives in our mind for ICAIF 2021:
Research Initiatives:

Portfolio Allocation using DRL;
High-frequency trading using DRL;
Cryptocurrency trading using DRL;
DRL v.s. Human trader;
Live trading using DRL;
Application of RL to Financial Arbitrage;
Explainable DRL in Finance;
Quantum RL in finance;
Multi-Agent RL in Finance;
Closing the simulation-reality gap of DRL in Finance;
SOTA DRL for Finance (checking RLZoo);
Benchmarking DRL performance in Finance;
Lightweight DRL in Finance;
Sequential RL in Finance;
inverse reinforcement learning in Finance;
Hamiltonian reinforcement learning in finance;
Hamilton-Jacobi-Bellman Equations for continuous RL in finance;
Mean Field Multi-Agent Reinforcement Learning in finance;


Error when writing the headers in pyslow5

Hello, I got the error 'NoneType' object has no attribute 'encode'
python version: 3.11.2
pyslow5 version: 1.1.0
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[13], line 8
      5 end_reason_labels = s5_input.get_aux_enum_labels('end_reason')
      6 headers = s5_input.get_all_headers(read_group=0)
----> 8 ret = s5_out.write_header(headers, read_group=0, end_reason_labels=end_reason_labels)
      9 print("ret: write_header(): {}".format(ret))
     11 for read in s5_input.reads_multi(threads=92, batchsize=4096, aux='all'):

File python/pyslow5.pyx:1692, in pyslow5.Open.write_header()

AttributeError: 'NoneType' object has no attribute 'encode'

while running
# open file
s5_input = pyslow5.Open('/home/shared/e17-g13-nanopore-compression/hg/hg2_prom_lsk114_subsubsample/reads.blow5','r')
s5_out = pyslow5.Open('/home/uaudith/fyp/fft/1.slow5','w')

end_reason_labels = s5_input.get_aux_enum_labels('end_reason')
headers = s5_input.get_all_headers(read_group=0)

ret = s5_out.write_header(headers, read_group=0, end_reason_labels=end_reason_labels)
print("ret: write_header(): {}".format(ret))

for read in s5_input.seq_reads_multi(threads=92, batchsize=4096, aux='all'):
    # sig = read['signal']
    # fs = read['sampling_rate']
    # read['signal'] = transform(sig, fs, 20)

    # get an empty record and aux dictionary
    record, aux = s5_out.get_empty_record(aux=True)
    for i in read:
        if i in record:
            record[i] = read[i]
        if i in aux:
            aux[i] = read[i]

    # write the record
    ret = s5_out.write_record(record, aux)
s5_out.close()

I was able to solve this by replacing the header writing part with the following
s5_input = pyslow5.Open('/home/shared/e17-g13-nanopore-compression/hg/hg2_prom_lsk114_subsubsample/reads.blow5','r')
s5_out = pyslow5.Open('/home/uaudith/fyp/fft/1.slow5','w')

end_reason_labels = s5_input.get_aux_enum_labels('end_reason')
header_original = s5_input.get_all_headers(read_group=0)

header, end_reason_labels = s5_input.get_empty_header(aux=True)
header_original = s5_input.get_all_headers()

for i in header_original:
    if i in header:
        if header_original[i] is None:
            continue
        else:
            header[i] = header_original[i]

ret = s5_out.write_header(header, read_group=0, end_reason_labels=end_reason_labels)

With that, I am getting the following error message but does not crash
06-Sep-23 19:51:43 - pyslow5 - [ERROR]: write_record: slow5_aux_set could not write aux value end_reason: 6
After the script was completed, the compression method was shown as none. I tried again with setting s5_out = pyslow5.Open('/home/uaudith/fyp/fft/1.slow5','w', rec_press="zlib", sig_press="svb-zd") but did not succeed.

Your insights are very much appreciated.

Hey,
So the first error, where encode can't operate on None, I will look into that. Looks like an oversight in my testing for absent values.
For the 2nd issue, it looks like your enum labels are not matching up with your data. Nanopore changed this recently and it can be a bit confusing. Can you dump the enum table from your data? And compare to what you are writing to file in the header?
For the third issue, with compression, you are writing to a slow5 file. This is an ascii human readable format. It will not apply any compression, even if you give the values. Change your extension output to blow5 and your compression args will work.
Hope this helps
Cheers,
James

Thank you for the quick reply.
How do I get the enum table? is it the s5_input.get_aux_enum_labels('end_reason')
which gives,
['unknown', 'partial', 'mux_change', 'unblock_mux_change', 'data_service_unblock_mux_change', 'signal_positive', 'signal_negative']

Yea so you can see the 2 different kinds if enum nanopore have going. The one with data_service_unblock_mux_change is the latest one. Older data will only have the 5 fields. Worse, is they store the enum value, so when they changed the order by putting a label in the middle instead of the end, it made a real mess of things lol.
So that error of trying to write an enum value of 6 is using the old enum labels rather than the new enum labels.
Does that make sense?

So when you get the headers, the second arg return has the old enum table. Update it with the latest one instead, and use that rather than the default provided by pyslow5.
The empty header commands are more of a help for the user. I wrote it that way instead of hard coding it into the api because ont do silly things like change field names, types, and values on a whim. Sorry this has caused a problem for yet another developer.
Let me know if you can get it working.
(also there is another issue that has some example code to do what I describe. Let me get that)

Have a look at the code here
https://github.com/hasindu2008/slow5lib/issues/70#issuecomment-1594094571

Thank you. It makes sense. I will try and update here.
Also, could you suggest a method to achieve parallelism when we read from a blow5, perform some processing, and then write to a new file? My initial thought was to employ a queue to store the reads from the input file and process it using Python's multiprocessing module. Would this approach cause issues when multiple processes attempt to write to the output file using s5_out.write_record?

You can read and write with multithreading on the slow5lib C side of pyslow5 with the seq_reads_multi() and write_record_batch() functions.
So reading from one big file and writing ti one big file, you have a similar setup to my buttery-eel basecalling wrapper.
The method I used there, was read the file and submit to an input queue using a single process. Spawn python processes to pull from the queue, and do stuff. Then I submit the output to an output queue. I then have a single process that pulls from the output queue, and writes to the output file.
So you can read and write with the single threaded method, or the multithreaded methods. Basically, the threading is used in the decompression/compression steps.
Alternatively, you can split your files, and read many/write many and let a process handle each file.
Do not have multiple processes write to the same file. That will not go well. It was bot designed to do that.
Given we can write zstd blow5 files ~2x faster than pod5 files, I think you should have pretty good performance. Have a look at blue-crab in my repos for that pattern.
Hope that helps. Of course let me know if you want some boiler plate code, but buttery-eel and blue-crab should have what you need.
Cheers
James

Specifically the multiproc branch of buttery-eel, these lines here
https://github.com/Psy-Fer/buttery-eel/blob/multiproc/src/buttery_eel.py#L691-L711
then you can see how I handle the queues and such in the functions.

Correct me if I am wrong, but although the reading itself is multi-process, the next processing or transformation step is a single process. which can be a bottleneck if we are doing CPU-bound operations. So what I think is one process to put the reads into a queue and a set of processes (a pool) to process them and put them back into another queue. And another single process to write_record_batch().

Thank you for the links. Looks like my use case is pretty similar to what you shared


Create Veterans, Active Duty, and Reservists page

Is there more information for this page?

@hollomancer @davidmolina what would you like to see from this page? @NestorSegura is very eager to contribute.

Curious if this (#155), #156 and #154 can be simplified as a single "Who We Serve" page as outlined in the footer of the redesigns landing page mock?


implement simple parallel processing

Measured difference in the times for processing the ./ of inclusivelint repo/folder:
  | with PP | without PP
-- | -- | --
min:sec start | 3:50 | 5:31
min:sec end | 5:14 | 7:16
total | 1:24 | 1:45
  | difference: | 0:21


Fix issue 88

Fixes axios-retry issue. I was only able to reproduce this issue in a typescript consumer, for reasons I don't completely understand. Maybe some typescript global isolation - if anyone knows, I'm curious.

I branched from upstream/master, which picked up a few changes. Bumped to 1.0.2. Looks like we manually deploy this lib?

@TwoSlick Do you know how we've been deploying this package? Can we get this merged and published? If I can help, let me know.


feat(jest-environment-node) add crypto to test environment node

Summary
Add crypto to jest environment node, for context, see: https://github.com/jestjs/jest/issues/14679
Test plan
Not sure whether we need test here? webCrypto is introduced to node since v16, which is the lowest version jest@29 supports I think?

Ah that's right, there must be some weird setting in my config, I will check it out. Thanks.


Update index.html

Added Tile Color for Mobile View In Google Chrome and Compatible for IE-Edge

this PR provides no details on what was changed in index.html or why. I'd suggest re-submitting with a little more detail.


Update PR close pipeline definition ID

Previous pipeline was closed - and a new one added in its place
Does this PR introduce a breaking change? (check one with "x")
[ ] Yes
[ ] No

Pipeline status is now green


Implement search chaining

coverage: 93.773% (-0.09%) from 93.864% when pulling d1317f39db28e4e7cc440e41ab1a00aa072a2e62 on search-chaining into bc2d910563d8358f8a1f04fd103efe0777a34f86 on main.


Use native type=month picker on mobile devices

[ ] check FF/IE11 degradation
[ ] enketo-xslt
[ ] figure out conversion

On unsupported browsers (many: IE, Edge, Safari, FF) this becomes a text input field.


Support pyenv?

Currently formatters-python supports setting a global binary path or relative to project dir.
However, I am using pyenv and pyenv puts all virtualenvs inside ~/.pyenv/versions/.
I have tried to set the global binary to ~/.pyenv/shims/isort and end up getting:
formatters-python: /Users/futursolo/.pyenv/shims/isort,--quiet,--settings-path,/path-to-my-project/pyproject.toml,"/path-to-my-project/test.py"

pyenv: isort: command not found
formatters-python: /Users/futursolo/.pyenv/shims/isort,--quiet,--settings-path,/path-to-my-project/pyproject.toml,"/path-to-my-project/test.py"

The `isort' command exists in these Python versions:

I tried to invoke this from within shell and it gets me the expected result.
I saw some other projects uses the %PROJECT_NAME to help on deciding the binary path.
Technically shims should work as-is if current working directory of the command is set to the root directory of the project.
It would be nice if formatters-python could support %PROJECT_NAME in binary path or invoke command inside project root.

Hey, are you sure this is not related to PATH issues? I haven't used pyenv so I don't know much about it.

Yes. It does not have anything to do with PATH. pyenv determines which virtualenv to activate by current working directory.
In the meantime, I was able to put together a shim to workaround the issue in a fairly stupid way by attempting to look for a project dir in args and pass it to pyenv as environment variables.
Hope this helps.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from typing import Optional
import sys
import subprocess
import pathlib
import os

exec_name = pathlib.Path(sys.argv[0]).name. # either save as the binary name or ln -s

shim_dir = pathlib.Path("~/.pyenv/shims/").expanduser()

projects_dir = pathlib.Path("/path-to-my-projects/")

def find_project_dir() -> Optional[str]:
    for arg in sys.argv[1:]:
        if arg.find("/") == -1:  # unlikely to be a path
            continue

        path = pathlib.Path(arg).resolve()
        try:
            rel_path = path.relative_to(projects_dir)

        except ValueError:
            continue

        try:
            proj_name = rel_path.parts[0]

        except IndexError:
            continue

        return str(projects_dir / proj_name)

    return None

def main() -> None:
    bin_path = shim_dir / exec_name
    env = dict(**os.environ)
    project_dir = find_project_dir() or "/"

    env["PWD"] = project_dir
    env["PYENV_DIR"] = project_dir # shouldn't need this if no-shell were spawned before Python shim is called.
    del env["PYENV_VERSION"] # shouldn't need this if no-shell were spawned before Python shim is called.

    proc = subprocess.run(
        [str(bin_path), *sys.argv[1:]],
        cwd=project_dir,
        env=env,
        stdin=None,
        stdout=None,
        stderr=None,
        check=False,
    )

    sys.exit(proc.returncode)

if __name__ == "__main__":
    main()

Hey, I've pushed a commit to pass cwd to the atom BufferedProcess,
Can you test it to see if it is working?
Steps:

clone this repo
cd into it
npm i
apm link
restart atom

Yes, it works perfectly.
Thank you for the fast fix!

Nice. Are you aware of any other environments which will need this same change?

No, I am not aware of other environment that has the same behaviour. Sorry about that.

Fixed with v1.2.1


Project doesn't build with GCC 11+ because of GTest and ABSL

Error looks like this
/home/gergoszabo/CLionProjects/Prog2_08/test-framework/googletest-src/googletest/src/gtest-death-test.cc: In function ‘bool testing::internal::StackGrowsDown()’:
/home/gergoszabo/CLionProjects/Prog2_08/test-framework/googletest-src/googletest/src/gtest-death-test.cc:1224:24: error: ‘dummy’ may be used uninitialized [-Werror=maybe-uninitialized]
 1224 |   StackLowerThanAddress(&dummy, &result);
      |   ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~
/home/gergoszabo/CLionProjects/Prog2_08/test-framework/googletest-src/googletest/src/gtest-death-test.cc:1214:13: note: by argument 1 of type ‘const void*’ to ‘void testing::internal::StackLowerThanAddress(const void*, bool*)’ declared here
 1214 | static void StackLowerThanAddress(const void* ptr, bool* result) {
      |             ^~~~~~~~~~~~~~~~~~~~~
/home/gergoszabo/CLionProjects/Prog2_08/test-framework/googletest-src/googletest/src/gtest-death-test.cc:1222:7: note: ‘dummy’ declared here
 1222 |   int dummy;

Is this still an issue?

No, I think that since we merged v9.5 from Google, the problem was fixed


Question-How are streams determined from files?

For example, I have a plexon file that contains data grouped into 3 catagories.  The wideband, the field potential of the wideband, and the spikes from the wideband.  When reading the file and accessing a specific stream, the field potential is grouped into one stream and the wideband as well as the spikes are grouped into another stream.  How are these streams determined and is it possible to separate the wideband and spikes into separate streams so I am able to only access one or the other?  The wideband and spikes both have a sampling frequency of 40,000 hertz while the field potential has a sampling frequency of 10,000 hertz?

plexon 1 or plexon 2? (plx for pl2 files). The docs explain the general idea here.
But basically if the sampling frequencies are different they have to be different streams. I'm surprised Wideband and spikes are in the same stream. Once you let me know which plexon I'll dig into more :)

I see. yeah that might be a little bit of poor organization on our part. It seems like with the current setup you would just have to do a channel slice to get the correct channel for your purposes instead. Could you do the following and put it here.
from neo.rawio import PlexonRawIO

reader = PlexonRawIO(file_name)

reader.parse_header()

print(reader)
print(reader.header)

Once I double check how that displays I could check to see if there is a way to split those into separate streams. I might need a test file though.

That's why I'm having you run the print reader and print reader.header. If we aren't labeling the channels right, then it would be impossible, but often we give the channel's "names" which you could use to do the slice. Could you do the script I posted above so we can see if it is possible or whether we need to patch that right away ?

Spikeinterface defaults to the channel_ids
so above we have ('WB01', '0',), so channel_name 'WB01' is channel_id '0' and channel_index 0. So yes for a ChannelSliceRecording in this case you slice from  '0' - '15' to only get the WB channels.

It might be helpful if we make the channel_ids more meaningful in this case since we are losing WB vs spike information when going from name -> id which could cause mistakes for end users. I'll wait for some neuroconv people to weigh in, but I think if we can guarantee that the names are unique then we could use the names as the ids as well.

Two things:

At spikeinterface level there is an option to change names as ids that should be used for plexon. I think this will make it easier. I will open a PR.
@AbhiSwamiUConn I have a question, are you referring to the channels called SPKC as spikes? According to a plexon engineer that contribute here recently says that is just a filtered version of the wideband . That's the reason they are the same stream, they have the same dtype, they come from the same file and they have the same sampling rate.

I think that a stream is a very unfortunate name that has already expanded to other parts of the ecosystem and has lead to a lot of confusion. The thing is that stream is just an implementation detail of neo. It is the part of the format data that cean be thought as a single block and put into a numpy or memmap array. That's why it is defined by having the same dtype, sampling_frequency, shape and coming from the same file. Nothing more.
The problem is that we expose this implementation detail at the user level interface by making users access the data through streams. Users then get confused thinking that stream must mean something like "a type of qualitatively different data" and in some cases it makes sense (neuropixel has a stream for ap and lf bands for example) but in some others it does not see here my own confusion in the past:
https://github.com/NeuralEnsemble/python-neo/issues/1133
I don't know if this should be made more prominent in the docs. As I mention it has lead to confusion in others parts of the ecosystem:
https://github.com/catalystneuro/roiextractors/issues/245

Thanks for the clarification:
In spikeinterface it should be easy if we merge this PR:
https://github.com/SpikeInterface/spikeinterface/pull/3193

Thanks for clarifying both. Sorry yeah spikes in neo are suppose to be their own thing, but if spkc if just filtered than in Neo parlance it would absolutely be in the same stream.
I agree we should probably find a better explanation of stream for our docs!

OK, now that https://github.com/SpikeInterface/spikeinterface/pull/3193 is merged on spikeinterface I wrote the asnwer to your question in #3196 @AbhiSwamiUConn
I think that we can close this @zm711 or maybe you want to leave it open until we write better documentation for this? The thing is that I am not sure the stream is ever exposed on neo directly, right?

Actually, final question @AbhiSwamiUConn. Do you happen to know what are the types of filering that is implemented for the "FP" and "SPKC" channels? It would be good for us to know more about this metadata.

I think that we can close this @zm711 or maybe you want to leave it open until we write better documentation for this? The thing is that I am not sure the stream is ever exposed on neo directly, right?

They are exposed. here for example. The stream index gives us the sample rate, the gain, and the offset for the data so we can convert it and is necessary for the user functions. So I think we do need to document it. But stream itself is not exposed, just the indices of the streams. Is that your point?

My question was not well phrased. I guess the core of my question? Do users of neo need to know about streams the same way that users of spikeinterface need to know about streams?
In spikeinterface you need to know the streams to access the data but as I am not a userr of neo I don't know how users interact with the concept of stream and if this type of confusion can arise at the neo level.

Do users of neo need to know about streams the same way that users of spikeinterface need to know about streams?

Yes.
reader = neo.RawIO()
reader.parse_header()

in this example the reader will have the memmap for all streams, but to actually pull out the data you need to specify which stream of data you want. I would actually say that spikeinterface is nicer in that it can be fed with name, whereas all the functions at the rawio level expect the stream index. So you run into the issue that if you don't know the IO it isn't clear how to get what you want
ie how do you get digital data for intan -> you need stream_index = 3. So you basically need to look in the header to see which stream goes where. Again Intan has good names in the header, but it seems like Plexon says streams are Signal 0 and Signal 1 which aren't super helpful.

Yes, we probably should have better signal streams in plexon but I we will need someone who actually has experimental experience with the format to venture in that direction.

Actually, final question @AbhiSwamiUConn. Do you happen to know what are the types of filering that is implemented for the "FP" and "SPKC" channels? It would be good for us to know more about this metadata.

It just appears to use a combination of highpass and lowpass filtering.

Thanks, I wonder if the values of the bandpass are fixed or something that people decide at run time.

Closing now that I have a docs issue open.


Does not work on MAC

I am trying to use this on mac:
I am getting this error:
adb-sync ../COPY_TEST/ mnt/sdcard/
Traceback (most recent call last):
File "/usr/local/bin/adb-sync", line 774, in
main(*sys.argv)
File "/usr/local/bin/adb-sync", line 693, in main
args_encoding = locale.getdefaultlocale()[1]
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/locale.py", line 543, in getdefaultlocale
return _parse_localename(localename)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/locale.py", line 475, in _parse_localename
raise ValueError, 'unknown locale: %s' % localename
ValueError: unknown locale: UTF-8
can anyone help please

Try https://coderwall.com/p/-k_93g/mac-os-x-valueerror-unknown-locale-utf-8-in-python

locale.getdefaultlocale() failing seems to be a Python bug to me, not an adb-sync bug.
Does the workaround on coderwall.com work for you? It might be possible to put this into adb-sync itself, as a hack.

I managed to get it working.
Big thanks guys.
On Thursday, 3 November 2016, divVerent<EMAIL_ADDRESS>wrote:

locale.getdefaultlocale() failing seems to be a Python bug to me, not an
adb-sync bug.
Does the workaround on coderwall.com work for you? It might be possible
to put this into adb-sync itself, as a hack.
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/google/adb-sync/issues/7#issuecomment-258139861, or mute
the thread
https://github.com/notifications/unsubscribe-auth/AHF_zuHjnw4mM_JzVCTLXjxVJGOzc2q8ks5q6d-qgaJpZM4Kn_KV
.


JAV-30 Auto Configration code for spring-boot-starter-discovery

Auto Service Registration for spring-boot-starter-discovery

Coverage decreased (-0.1%) to 81.348% when pulling 8a601961b16e92ce5f331bf0f66613771620aa95 on asifhuawei:discovery-latest into 8771009d302ec5f3126eab86b142d2fe9d9001c5 on ServiceComb:master.

Coverage remained the same at 81.448% when pulling<PHONE_NUMBER>40784fa229a6cbbcfc0bdf781090e0 on asifhuawei:discovery-latest into 8771009d302ec5f3126eab86b142d2fe9d9001c5 on ServiceComb:master.

Coverage decreased (-0.008%) to 81.441% when pulling<PHONE_NUMBER>40784fa229a6cbbcfc0bdf781090e0 on asifhuawei:discovery-latest into 8771009d302ec5f3126eab86b142d2fe9d9001c5 on ServiceComb:master.

Coverage remained the same at 81.448% when pulling 3428b768d4b37a0a64a5c6899a80d5f3d641b0d4 on asifhuawei:discovery-latest into 8771009d302ec5f3126eab86b142d2fe9d9001c5 on ServiceComb:master.

Coverage increased (+0.008%) to 81.448% when pulling 687aef9fa694f4b60f29250addcd968af8390973 on asifhuawei:discovery-latest into c1c38661b4b99109083f17f8550308ad645bd2a2 on ServiceComb:master.

could you add this <module>demo-spring-boot-discovery</module> to demo-parent to enable it for testing? I can't get it pass on my laptop.

Coverage decreased (-0.7%) to 80.709% when pulling e63d9b6d5c20e0bae4e7022c33ec21ea7a119bd0 on asifhuawei:discovery-latest into c1c38661b4b99109083f17f8550308ad645bd2a2 on ServiceComb:master.

Added the "spring-boot-starter-discovery" and "demo-spring-boot-starter-discovery" in parent pom

Coverage decreased (-0.1%) to 81.297% when pulling 3cfa5af4d55baa01a2dbd987509eb419164888e8 on asifhuawei:discovery-latest into c1c38661b4b99109083f17f8550308ad645bd2a2 on ServiceComb:master.

Coverage decreased (-1.2%) to 80.246% when pulling 5343dd0ef1bbb47977d6e55f4c6123e4d9519de0 on asifhuawei:discovery-latest into c1c38661b4b99109083f17f8550308ad645bd2a2 on ServiceComb:master.

Coverage decreased (-0.5%) to 80.96% when pulling 6707f17b9da5b2a3514961336f1dba251f77157c on asifhuawei:discovery-latest into c1c38661b4b99109083f17f8550308ad645bd2a2 on ServiceComb:master.

Coverage decreased (-0.4%) to 81.035% when pulling e5882b93aa4fd65f15358977f4e29ede1c60fa80 on asifhuawei:discovery-latest into c1c38661b4b99109083f17f8550308ad645bd2a2 on ServiceComb:master.

Coverage decreased (-0.4%) to 81.079% when pulling b8c79cac798e6b29acf233dc8bc500cab2eda9f8 on asifhuawei:discovery-latest into c1c38661b4b99109083f17f8550308ad645bd2a2 on ServiceComb:master.


[#1727] Use default RetryOptions for LocalActivities when not set

Setting setMaximumAttempts=0 (or not setting any value, default = 0) for local activities should make the activity retry forever.
This is currently broken because the logic treats both no policy set and a policy with all default values (including MaxiumAttempts = 0) as abort conditional.  What should happen (at least according the doc and to align with normal activities) is that no policy set should be processed according to the default values of the retry policy, which includes unlimited retries when the MaxiumAttempts = 0.
Fixes #1727

Hey @ghaskins I know we discussed this a bit offline, but if we do want to change this we should add some tests (like the one in the reproduction you provided) that this change fixes.

@Quinn-With-Two-Ns ok, I can take a stab at that.  Normally I would have already submitted them but I was having trouble with the UT framework on my mac (most tests seem to be failing even with unmodified code).  I'll see if I can sort that out.


Fix truffle-migrate example

The truffle-migrate example has a compile issue. https://github.com/zeppelinos/zos/tree/master/examples/truffle-migrate
The package.json uses Truffle 5 but the .sol files are still Solidity 0.4.  We could either downgrade truffle or update to solidity 0.5.  This PR makes updates to get the example running with the latest.
The changes;

Rename truffle.js to truffle-config.js (this is a new approach, allowing the Truffle command to work correctly on Windows)
Added a compiler version to truffle-config.  I believe this is optional and we could remove that change.
Update Migrations.sol - this required changes for Solidity 0.5, instead of doing that myself I pulled the latest from https://github.com/trufflesuite/truffle-init-default
Update the .sol files pragma and memory for Solidity 0.5
Rebuilt the package-lock file, the one checked in at the moment is out of sync (if you run npm ci it fails).

Oh sorry, I just read the contribution guide.  I can close this and resubmit using the correct branch name and referencing a bug if you prefer

@hardlydifficult no worries, the PR is great, I'm happy to merge!

Thanks for the contribution!!


mosquitto: 1.6.6 -> 1.6.7

Semi-automatic update generated by https://github.com/ryantm/nixpkgs-update tools. This update was made based on information from https://repology.org/metapackage/mosquitto/versions.
meta.description for mosquitto is: '"An open source MQTT v3.1/3.1.1 broker"'.
meta.homepage for mosquitto is: '"https://mosquitto.org/"
Compare changes on GitHub

Checks done (click to expand)

built on NixOS

The tests defined in passthru.tests, if any, passed

0 of 0 passed binary check by having a zero exit code.

0 of 0 passed binary check by having the new version present in output.

found 1.6.7 with grep in /nix/store/ggni9ipy5x3ndyi61f0y02kylfi8zvf4-mosquitto-1.6.7

directory tree listing: https://gist.github.com/616858b492bcc094b72560d476b26924

du listing: https://gist.github.com/64865d471f6908cf1dc458020a6920ab

Rebuild report (if merged into master) (click to expand)

16 total rebuild path(s)
4 package rebuild(s)
4 x86_64-linux rebuild(s)
4 i686-linux rebuild(s)
4 x86_64-darwin rebuild(s)
4 aarch64-linux rebuild(s)
First fifty rebuilds by attrpath
collectd
collectd-data
haskellPackages.c-mosquitto
mosquitto

Instructions to test this update (click to expand)

Either download from Cachix:
nix-store -r /nix/store/ggni9ipy5x3ndyi61f0y02kylfi8zvf4-mosquitto-1.6.7 \
  --option binary-caches 'https://cache.nixos.org/ https://r-ryantm.cachix.org/' \
  --option trusted-public-keys '
  r-ryantm.cachix.org-1:gkUbLkouDAyvBdpBX0JOdIiD2/DP1ldF3Z3Y6Gqcc4c=
  cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=
  '

(r-ryantm's Cachix cache is only trusted for this store-path realization.)
Or, build yourself:
nix-build -A mosquitto https://github.com/r-ryantm/nixpkgs/archive/0f7e552427ed126bd65e290eae66cd426c73dca5.tar.gz

After you've downloaded or built it, look at the files and if there are any, run the binaries:
ls -la /nix/store/ggni9ipy5x3ndyi61f0y02kylfi8zvf4-mosquitto-1.6.7
ls -la /nix/store/ggni9ipy5x3ndyi61f0y02kylfi8zvf4-mosquitto-1.6.7/bin

cc @peterhoeg for testing.

@jonringer, did you try the nixos test as well?

@GrahamcOfBorg test mosquitto

i did not, but ofborg did :)


[web] CanvasKit error on ParagraphBuilder.addPlaceholder

Steps to Reproduce

Run git clone https://github.com/vsmenon/bug1.git.
cd bug1
flutter run -d chrome --web-renderer canvaskit

Expected results:
The text Hello World in Chrome.  Works as expected with html renderer and flutter desktop.
Actual results:
Error in console:
══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
The following JSNoSuchMethodError was thrown during performLayout():
TypeError: Cannot convert "[object Object]" to float

The relevant error-causing widget was:
  Text
  file:///Users/vsm/.pub-cache/hosted/pub.dartlang.org/flutter_html-1.1.1/lib/html_parser.dart:752:19

When the exception was thrown, this was the stack:
<EMAIL_ADDRESS>212:169         toWireType
<EMAIL_ADDRESS>169:242         ParagraphBuilder$_addPlaceholder
<EMAIL_ADDRESS>73:415          addPlaceholder
lib/_engine/engine/canvaskit/text.dart 617:23                            [_addPlaceholder]
lib/_engine/engine/canvaskit/text.dart 612:5                             addPlaceholder

Version is a recent master:
Flutter 1.26.0-2.0.pre.167 • channel master • git@github.com:flutter/flutter.git
Framework • revision d3a2259541 (4 days ago) • 2020-12-31 15:14:03 -0500
Engine • revision 82b4ae86d6
Tools • Dart 2.12.0 (build 2.12.0-179.0.dev)

The JS interop signature in canvaskit_api.dart appears to be wrong.
This PR fixes (with caveat below): https://github.com/flutter/engine/pull/23408/files
Some other issues:

I hit this because launching from vscode seems to automatically select the canvaskit renderer.  Launch via flutter run seems to select the html one.  Is this a known inconsistency?
Even with this fix, the text color is wrong - black instead of white.  This appears to work correctly with the html backend and flutter desktop.

The JS interop signature in canvaskit_api.dart appears to be wrong.
This PR fixes (with caveat below): https://github.com/flutter/engine/pull/23408/files
Some other issues:

I hit this because launching from vscode seems to automatically select the canvaskit renderer.  Launch via flutter run seems to select the html one.  Is this a known inconsistency?
Even with this fix, the text color is wrong - black instead of white.  This appears to work correctly with the html backend and flutter desktop.

@vsmenon
I do see the the error when running flutter run -d chrome --web-renderer canvaskit, but not while running flutter run -d chrome.
Also, I see that you are using flutter_html which is 3rd party. Can you also try by removing the plugin code and use web core  elements and check if you still get the error ?

@vsmenon
I do see the the error when running flutter run -d chrome --web-renderer canvaskit, but not while running flutter run -d chrome.
Also, I see that you are using flutter_html which is 3rd party. Can you also try by removing the plugin code and use web core  elements and check if you still get the error ?

There does appear to be a clear bug in canvaskit_api.dart though.  Here's the .d.ts:
https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/canvaskit-wasm/index.d.ts#L663
Fixing the Dart to match that (https://github.com/flutter/engine/pull/23408/files) appears to fix this issue (but see caveats above).

There does appear to be a clear bug in canvaskit_api.dart though.  Here's the .d.ts:
https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/canvaskit-wasm/index.d.ts#L663
Fixing the Dart to match that (https://github.com/flutter/engine/pull/23408/files) appears to fix this issue (but see caveats above).

@vsmenon
The error log shows:
The relevant error-causing widget was:   Text   file:///Users/vsm/.pub-cache/hosted/pub.dartlang.org/flutter_html-1.1.1/lib/html_parser.dart:752:19 which seem to point to flutter_html plugin's html_parser.dart, hence I suggested if you can check if this also happens if you remove the said plugin.

@vsmenon
The error log shows:
The relevant error-causing widget was:   Text   file:///Users/vsm/.pub-cache/hosted/pub.dartlang.org/flutter_html-1.1.1/lib/html_parser.dart:752:19 which seem to point to flutter_html plugin's html_parser.dart, hence I suggested if you can check if this also happens if you remove the said plugin.

Sorry, I haven't had a chance to isolate further.  FYI - @ferhatb - marking P3 as you suggested offline.

Sorry, I haven't had a chance to isolate further.  FYI - @ferhatb - marking P3 as you suggested offline.

/cc @yjbanov @hterkelsen

/cc @yjbanov @hterkelsen

Issue reproducible on latest master.

flutter doctor -v
[✓] Flutter (Channel master, 1.26.0-2.0.pre.275, on Mac OS X 10.15.4 19E2269
    darwin-x64, locale en-IN)
    • Flutter version 1.26.0-2.0.pre.275 at
      /Users/dhs/documents/Fluttersdk/flutter
    • Framework revision d9044a8a61 (2 days ago), 2021-01-09 04:04:04 -0500
    • Engine revision caf6a8191f
    • Dart version 2.12.0 (build 2.12.0-204.0.dev)

[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.0)
    • Android SDK at /Users/dhs/Library/Android/sdk
    • Platform android-30, build-tools 30.0.0
    • Java binary at: /Applications/Android
      Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build
      1.8.0_242-release-1644-b3-6915495)
    • All Android licenses accepted.

[!] Xcode - develop for iOS and macOS (Xcode 12.0.1)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 12.0.1, Build version 12A7300
    ! CocoaPods 1.9.3 out of date (1.10.0 is recommended).
        CocoaPods is used to retrieve the iOS and macOS platform side's plugin
        code that responds to your plugin usage on the Dart side.
        Without CocoaPods, plugins will not work on iOS or macOS.
        For more info, see https://flutter.dev/platform-plugins
      To upgrade see
      https://guides.cocoapods.org/using/getting-started.html#installation for
      instructions.

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 4.1)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build
      1.8.0_242-release-1644-b3-6915495)

[✓] VS Code (version 1.52.1)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.16.0

[✓] Connected device (2 available)
    • macOS (desktop) • macos  • darwin-x64     • Mac OS X 10.15.4 19E2269
      darwin-x64
    • Chrome (web)    • chrome • web-javascript • Google Chrome 87.0.4280.141

! Doctor found issues in 1 category.

Issue reproducible on latest master.

flutter doctor -v
[✓] Flutter (Channel master, 1.26.0-2.0.pre.275, on Mac OS X 10.15.4 19E2269
    darwin-x64, locale en-IN)
    • Flutter version 1.26.0-2.0.pre.275 at
      /Users/dhs/documents/Fluttersdk/flutter
    • Framework revision d9044a8a61 (2 days ago), 2021-01-09 04:04:04 -0500
    • Engine revision caf6a8191f
    • Dart version 2.12.0 (build 2.12.0-204.0.dev)

[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.0)
    • Android SDK at /Users/dhs/Library/Android/sdk
    • Platform android-30, build-tools 30.0.0
    • Java binary at: /Applications/Android
      Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build
      1.8.0_242-release-1644-b3-6915495)
    • All Android licenses accepted.

[!] Xcode - develop for iOS and macOS (Xcode 12.0.1)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 12.0.1, Build version 12A7300
    ! CocoaPods 1.9.3 out of date (1.10.0 is recommended).
        CocoaPods is used to retrieve the iOS and macOS platform side's plugin
        code that responds to your plugin usage on the Dart side.
        Without CocoaPods, plugins will not work on iOS or macOS.
        For more info, see https://flutter.dev/platform-plugins
      To upgrade see
      https://guides.cocoapods.org/using/getting-started.html#installation for
      instructions.

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 4.1)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build
      1.8.0_242-release-1644-b3-6915495)

[✓] VS Code (version 1.52.1)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.16.0

[✓] Connected device (2 available)
    • macOS (desktop) • macos  • darwin-x64     • Mac OS X 10.15.4 19E2269
      darwin-x64
    • Chrome (web)    • chrome • web-javascript • Google Chrome 87.0.4280.141

! Doctor found issues in 1 category.

I noticed the "WidgetSpan#38c3d" in the original exception.
The official https://api.flutter.dev/flutter/widgets/WidgetSpan-class.html example crashes with a similar error on the latest Flutter master branch
/cc @yjbanov @hterkelsen @darshankawar
Minimal reproducible example :
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Welcome to Flutter',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Welcome to Flutter'),
        ),
        body: Center(
          child: Text.rich(TextSpan(
            children: <InlineSpan>[
              TextSpan(text: 'Flutter is'),
              WidgetSpan(
                  child: SizedBox(
                width: 120,
                height: 50,
                child: Card(child: Center(child: Text('Hello World!'))),
              )),
              TextSpan(text: 'the best!'),
            ],
          )),
        ),
      ),
    );
  }
}

══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
The following JSNoSuchMethodError was thrown during performLayout():
TypeError: Cannot convert "[object Object]" to float

The relevant error-causing widget was:
  Text file:///Users/dev/Desktop/example/lib/main.dart:15:23

When the exception was thrown, this was the stack:
<EMAIL_ADDRESS>217:169         toWireType
<EMAIL_ADDRESS>174:403         ParagraphBuilder$_addPlaceholder
<EMAIL_ADDRESS>73:409          addPlaceholder
lib/_engine/engine/canvaskit/text.dart 644:23                            [_addPlaceholder]
lib/_engine/engine/canvaskit/text.dart 639:5                             addPlaceholder
packages/flutter/src/widgets/widget_span.dart 110:12                     build
packages/flutter/src/painting/text_span.dart 211:14                      build
packages/flutter/src/painting/text_span.dart 211:14                      build
packages/flutter/src/painting/text_painter.dart 569:7                    layout
packages/flutter/src/rendering/paragraph.dart 515:18                     [_layoutText]
packages/flutter/src/rendering/paragraph.dart 538:5                      [_layoutTextWithConstraints]
packages/flutter/src/rendering/paragraph.dart 651:5                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/shifted_box.dart 430:7                    performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/custom_layout.dart 171:10                 layoutChild
packages/flutter/src/material/scaffold.dart 911:7                        performLayout
packages/flutter/src/rendering/custom_layout.dart 243:7                  [_callPerformLayout]
packages/flutter/src/rendering/custom_layout.dart 407:14                 performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/proxy_box.dart 1371:11                    performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/layout_helper.dart 54:10                  layoutChild
packages/flutter/src/rendering/stack.dart 570:43                         [_computeSize]
packages/flutter/src/rendering/stack.dart 597:12                         performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/proxy_box.dart 3362:13                    performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/widgets/overlay.dart 743:14                         performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/custom_paint.dart 518:11                  performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/view.dart 166:7                           performLayout
packages/flutter/src/rendering/object.dart 1634:7                        [_layoutWithoutResize]
packages/flutter/src/rendering/object.dart 884:17                        flushLayout
packages/flutter/src/rendering/binding.dart 453:19                       drawFrame
packages/flutter/src/widgets/binding.dart 870:13                         drawFrame
packages/flutter/src/rendering/binding.dart 319:5                        [_handlePersistentFrameCallback]
packages/flutter/src/scheduler/binding.dart 1144:15                      [_invokeFrameCallback]
packages/flutter/src/scheduler/binding.dart 1082:9                       handleDrawFrame
packages/flutter/src/scheduler/binding.dart 865:7                        <fn>
dart-sdk/lib/_internal/js_dev_runtime/private/isolate_helper.dart 48:19  internalCallback

The following RenderObject was being processed when the exception was fired: RenderParagraph#a3027 relayoutBoundary=up2
NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE:
  creator: RichText ← Text ← Center ← _BodyBuilder ← MediaQuery ← LayoutId-[<_ScaffoldSlot.body>] ←
    CustomMultiChildLayout ← AnimatedBuilder ← DefaultTextStyle ← AnimatedDefaultTextStyle ←
    _InkFeatures-[GlobalKey#3b00f ink renderer] ← NotificationListener<LayoutChangedNotification> ← ⋯
  parentData: offset=Offset(0.0, 0.0) (can use size)
  constraints: BoxConstraints(0.0<=w<=1200.0, 0.0<=h<=696.0)
  size: MISSING
  textAlign: start
  textDirection: ltr
  softWrap: wrapping at box width
  overflow: clip
  locale: en_US
  maxLines: unlimited
This RenderObject had the following descendants (showing up to depth 5):
    text: TextSpan
      TextSpan
        TextSpan
        WidgetSpan#1a0c5
        TextSpan
════════════════════════════════════════════════════════════════════════════════════════════════════
Another exception was thrown: Assertion failed:
file:///Users/dev/flutter/packages/flutter/lib/src/rendering/shifted_box.dart:341:12
Another exception was thrown: TypeError: Cannot convert "[object Object]" to float

flutter doctor -v

[✓] Flutter (Channel master, 1.26.0-2.0.pre.275, on macOS 11.1 20C69 darwin-arm, locale en-MK)
    • Flutter version 1.26.0-2.0.pre.275 at /Users/dev/flutter
    • Framework revision d9044a8a61 (2 days ago), 2021-01-09 04:04:04 -0500
    • Engine revision caf6a8191f
    • Dart version 2.12.0 (build 2.12.0-204.0.dev)

[✗] Android toolchain - develop for Android devices
    ✗ Unable to locate Android SDK.
      Install Android Studio from: https://developer.android.com/studio/index.html
      On first launch it will assist you in installing the Android SDK components.
      (or visit https://flutter.dev/docs/get-started/install/macos#android-setup for detailed instructions).
      If the Android SDK has been installed to a custom location, please use
      `flutter config --android-sdk` to update to that location.

[✓] Xcode - develop for iOS and macOS (Xcode 12.3)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 12.3, Build version 12C33
    • CocoaPods version 1.10.0

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[!] Android Studio (not installed)
    • Android Studio not found; download from https://developer.android.com/studio/index.html
      (or visit https://flutter.dev/docs/get-started/install/macos#android-setup for detailed instructions).

[✓] Connected device (1 available)
    • Chrome (web) • chrome • web-javascript • Google Chrome 87.0.4280.88

! Doctor found issues in 2 categories.

I noticed the "WidgetSpan#38c3d" in the original exception.
The official https://api.flutter.dev/flutter/widgets/WidgetSpan-class.html example crashes with a similar error on the latest Flutter master branch
/cc @yjbanov @hterkelsen @darshankawar
Minimal reproducible example :
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Welcome to Flutter',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Welcome to Flutter'),
        ),
        body: Center(
          child: Text.rich(TextSpan(
            children: <InlineSpan>[
              TextSpan(text: 'Flutter is'),
              WidgetSpan(
                  child: SizedBox(
                width: 120,
                height: 50,
                child: Card(child: Center(child: Text('Hello World!'))),
              )),
              TextSpan(text: 'the best!'),
            ],
          )),
        ),
      ),
    );
  }
}

══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
The following JSNoSuchMethodError was thrown during performLayout():
TypeError: Cannot convert "[object Object]" to float

The relevant error-causing widget was:
  Text file:///Users/dev/Desktop/example/lib/main.dart:15:23

When the exception was thrown, this was the stack:
<EMAIL_ADDRESS>217:169         toWireType
<EMAIL_ADDRESS>174:403         ParagraphBuilder$_addPlaceholder
<EMAIL_ADDRESS>73:409          addPlaceholder
lib/_engine/engine/canvaskit/text.dart 644:23                            [_addPlaceholder]
lib/_engine/engine/canvaskit/text.dart 639:5                             addPlaceholder
packages/flutter/src/widgets/widget_span.dart 110:12                     build
packages/flutter/src/painting/text_span.dart 211:14                      build
packages/flutter/src/painting/text_span.dart 211:14                      build
packages/flutter/src/painting/text_painter.dart 569:7                    layout
packages/flutter/src/rendering/paragraph.dart 515:18                     [_layoutText]
packages/flutter/src/rendering/paragraph.dart 538:5                      [_layoutTextWithConstraints]
packages/flutter/src/rendering/paragraph.dart 651:5                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/shifted_box.dart 430:7                    performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/custom_layout.dart 171:10                 layoutChild
packages/flutter/src/material/scaffold.dart 911:7                        performLayout
packages/flutter/src/rendering/custom_layout.dart 243:7                  [_callPerformLayout]
packages/flutter/src/rendering/custom_layout.dart 407:14                 performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/proxy_box.dart 1371:11                    performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/layout_helper.dart 54:10                  layoutChild
packages/flutter/src/rendering/stack.dart 570:43                         [_computeSize]
packages/flutter/src/rendering/stack.dart 597:12                         performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/proxy_box.dart 3362:13                    performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/widgets/overlay.dart 743:14                         performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/custom_paint.dart 518:11                  performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/proxy_box.dart 118:7                      performLayout
packages/flutter/src/rendering/object.dart 1777:7                        layout
packages/flutter/src/rendering/view.dart 166:7                           performLayout
packages/flutter/src/rendering/object.dart 1634:7                        [_layoutWithoutResize]
packages/flutter/src/rendering/object.dart 884:17                        flushLayout
packages/flutter/src/rendering/binding.dart 453:19                       drawFrame
packages/flutter/src/widgets/binding.dart 870:13                         drawFrame
packages/flutter/src/rendering/binding.dart 319:5                        [_handlePersistentFrameCallback]
packages/flutter/src/scheduler/binding.dart 1144:15                      [_invokeFrameCallback]
packages/flutter/src/scheduler/binding.dart 1082:9                       handleDrawFrame
packages/flutter/src/scheduler/binding.dart 865:7                        <fn>
dart-sdk/lib/_internal/js_dev_runtime/private/isolate_helper.dart 48:19  internalCallback

The following RenderObject was being processed when the exception was fired: RenderParagraph#a3027 relayoutBoundary=up2
NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE:
  creator: RichText ← Text ← Center ← _BodyBuilder ← MediaQuery ← LayoutId-[<_ScaffoldSlot.body>] ←
    CustomMultiChildLayout ← AnimatedBuilder ← DefaultTextStyle ← AnimatedDefaultTextStyle ←
    _InkFeatures-[GlobalKey#3b00f ink renderer] ← NotificationListener<LayoutChangedNotification> ← ⋯
  parentData: offset=Offset(0.0, 0.0) (can use size)
  constraints: BoxConstraints(0.0<=w<=1200.0, 0.0<=h<=696.0)
  size: MISSING
  textAlign: start
  textDirection: ltr
  softWrap: wrapping at box width
  overflow: clip
  locale: en_US
  maxLines: unlimited
This RenderObject had the following descendants (showing up to depth 5):
    text: TextSpan
      TextSpan
        TextSpan
        WidgetSpan#1a0c5
        TextSpan
════════════════════════════════════════════════════════════════════════════════════════════════════
Another exception was thrown: Assertion failed:
file:///Users/dev/flutter/packages/flutter/lib/src/rendering/shifted_box.dart:341:12
Another exception was thrown: TypeError: Cannot convert "[object Object]" to float

flutter doctor -v

[✓] Flutter (Channel master, 1.26.0-2.0.pre.275, on macOS 11.1 20C69 darwin-arm, locale en-MK)
    • Flutter version 1.26.0-2.0.pre.275 at /Users/dev/flutter
    • Framework revision d9044a8a61 (2 days ago), 2021-01-09 04:04:04 -0500
    • Engine revision caf6a8191f
    • Dart version 2.12.0 (build 2.12.0-204.0.dev)

[✗] Android toolchain - develop for Android devices
    ✗ Unable to locate Android SDK.
      Install Android Studio from: https://developer.android.com/studio/index.html
      On first launch it will assist you in installing the Android SDK components.
      (or visit https://flutter.dev/docs/get-started/install/macos#android-setup for detailed instructions).
      If the Android SDK has been installed to a custom location, please use
      `flutter config --android-sdk` to update to that location.

[✓] Xcode - develop for iOS and macOS (Xcode 12.3)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 12.3, Build version 12C33
    • CocoaPods version 1.10.0

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[!] Android Studio (not installed)
    • Android Studio not found; download from https://developer.android.com/studio/index.html
      (or visit https://flutter.dev/docs/get-started/install/macos#android-setup for detailed instructions).

[✓] Connected device (1 available)
    • Chrome (web) • chrome • web-javascript • Google Chrome 87.0.4280.88

! Doctor found issues in 2 categories.


Loading time of carriers & payment pages #23

@marionf i think it's ready for QA

@marionf @Alexisvallee I will have a check this morning for this error.

@marionf I can't reproduce, which version of php are you using?

@marionf Fixed, really thanks to you for your patience!

All good, thank you @PierreRambaud :+1:
So, just wait to #28 be fixed to finish the tests of this PR

@marionf This one should be ok too now.  =)

@MrBaiame are you ok with what I changed?


Reduce memory settings for LocalBookieEsemble in tests mode

Motivation
Reduce the amount of memory used for cache during the unit tests execution.

please retest this

retest this please


pre-curation EAR for fValHis1

Species: Valencia hispanica
Taxa: Metazoa: Chordata: Actinopteri: Cyprinodontiformes: Valenciidae: Valencia
Project: ERGA-BGE
URL: https://genomes.cnag.cat/erga-stream/species/32/

Hi @talioto Thanks for the EAR! Review will start asap :)

Hi @talioto
In general, looking very good. You listed the sex as ZW, so I was trying to look for these in the EAR. Do you think maybe the syntenic regions are merged in scaffold 20?

My only slight concern is maybe some of the sex chromosome is getting squashed out during the assembly collapse of nextdenovo. There appears to be some remaining kmers in the reads not included in the assembly at about 30/35X coverage.

I suspect you know best about the limitations of these pseudo-haplotype assemblers and suspect this is still one of the best ONT-based fish assemblies out there.
I will approve my review, let me know if anything I've said is unclear.
Tom

All EBP metrics are met and it looks very good. Agree with Tom that Nextdenovo's collapsed assembly may be the cause of the two things he is pointing out. What can you tell us about that? This is the first ONT-based assembly we have seen here, and your feedback is super welcomed in this testing phase.
@talioto I'll wait for your answer to approve this assembly and merge the PR

One important thing unrelated to the assembly: Please modify the pull request to merge it with the devel branch. Since this is a testing phase, we always work in the devel branch. The branch fValHis1 in your repo should be based on the devel branch, and you should create a PR to merge with the ERGA-consortium/EARs devel branch. This is only for the testing phase and soon will be all in the main.

In response to all the comments above:

Regarding pseudohalploid assemblies, this is typical that roughly half of the kmers in the heterozygous peak will be missing in the assembly.  In this case (and for MANY fish) the sex chromosomes are homomorphic. Unless we do phased assemblies (and I would like to, but this is still not standard across the field, and I don't have time to develop a new assembler;-), this is bound to happen. BTW, I listed it as ZW because it is a female sample and we requested the heterogametic sex. It is actually unknown to me whether it is XX or ZW.
Regarding the main vs devel branch, I was going to do it on the devel branch, but saw in the pull.gif that it was done on the main, so I switched to pulling vs. the main branch. I will try to fix this. In the meantime, please fix your documentation!

Thanks for the replies.
Warning added in the readme until we move out of testing.
I see that you are asking to merge to the devel branch now, nice. Still, I think that your branch fValHis1 should be based on devel, not main.

OK. If you want I will submit a new pull request.

Ok. Submit a new PR. I will close this PR and link the new one to this discussion to keep track of this discussion. Thanks Tyler, and sorry for the inconvenience of the testing phase :)


[Improvement] Filter blocks by taskIdBitmap before read shuffle data

Code of Conduct

[X] I agree to follow this project's Code of Conduct

Search before asking

[X] I have searched in the issues and found no similar issues.

What would you like to be improved?
I found that when we use AQE, every task will read data from all partitions, and just filter blocks by taskIdBitmap only when processing data files, it will lead to read redundant data from suffle server.
How should we improve?
Filter blocks by taskIdBitmap before read shuffle data
Are you willing to submit PR?

[X] Yes I am willing to submit a PR!

I already have this optimization. https://github.com/apache/incubator-uniffle/blob/47effb25044780013ff51cc516261464435b5829/client/src/main/java/org/apache/uniffle/client/impl/ShuffleReadClientImpl.java#L101

Well, but there are similar problems with reading from memory storage. I  want to solve it with #129 together.