nouveau_dri.so: undefined symbol: _glapi_set_nop_handler

weston-launch fails, see log below.
Do you have any hints or ideas about the undefined symbol error?
Date: 2000-02-01 UTC
[02:03:01.807] weston 1.7.0
               http://wayland.freedesktop.org
               Bug reports to: https://bugs.freedesktop.org/enter_bug.cgi?product=Wayland&component=weston&version=1.7.0
               Build: unknown (not built from git or tarball)
[02:03:01.807] OS: Linux, 4.0.0-171721-g055cb16, #1 SMP PREEMPT Fri May 29 12:25:06 UTC 2015, armv7l
[02:03:01.808] Starting with no config file.
[02:03:01.808] Loading module '/opt/nouveau/lib/weston/drm-backend.so'
[02:03:01.830] initializing drm backend
[02:03:01.832] udev path = /sys/devices/soc0/50000000.host1x/drm/drm/card0
[02:03:01.833] udev path = /sys/devices/soc0/50000000.host1x/drm/drm/card0/card0-HDMI-A-1
[02:03:01.834] udev path = /sys/devices/soc0/57000000.gpu/drm/card1
[02:03:01.836] using /dev/dri/card0
[02:03:01.836] Loading module '/opt/nouveau/lib/weston/gl-renderer.so'
gbm: failed to open any driver (search paths /opt/nouveau/lib/dri)
gbm: Last dlopen error: /opt/nouveau/lib/dri/nouveau_dri.so: undefined symbol: _glapi_set_nop_handler
failed to load driver: nouveau
gbm: failed to open any driver (search paths /opt/nouveau/lib/dri)
gbm: Last dlopen error: /opt/nouveau/lib/dri/kms_swrast_dri.so: cannot open shared object file: No such file or directory
failed to load driver: kms_swrast
gbm: failed to open any driver (search paths /opt/nouveau/lib/dri)
gbm: Last dlopen error: /opt/nouveau/lib/dri/swrast_dri.so: cannot open shared object file: No such file or directory
failed to load swrast driver
[02:03:01.851] failed to initialize egl
[02:03:01.851] fatal: failed to create compositor

Got the same here on fresh rebuild.
Should be a recent regression as i had it working 2 weeks ago.

I 'fixed' it. I removed /usr/lib/arm-linux-gnueabihf/libglapi.so.0 and /usr/lib/arm-linux-gnueabihf/libglapi.so.0.0.0.
weston-launch obviously uses the wrong version of that library, instead of using /opt/nouveau/lib/libglapi.so, it uses /usr/lib/arm-linux-gnueabihf/libglapi.so.0

Mmm that's weird. I am at an event this week, but will have a look at this once I'm back to regular work. Thanks for the pointer about the issue!

The RPATH of /opt/nouveau/lib/dri/nouveau_dri.so looks like this, interesting are the last two entries.
This could be the reason why it picks up the wrong version of libglapi.so
RPATH                /home/vagrant/l4t-nouveau/out/target/L4T/usr/lib/arm-linux-gnueabihf:/home/vagrant/l4t-nouveau/out/target/L4T/opt/nouveau/lib:/usr/lib/arm-linux-gnueabihf:/opt/nouveau/lib

I changed the RPATH of /opt/nouveau/lib/dri/nouveau_dri.so which did not result in success.
Turns out libgbm.so uses the same RPATH as mentioned above. So i changed the RPATH of /opt/nouveau/lib/libgbm.so and weston-launch succeeded without removing /usr/lib/arm-linux-gnueabihf/libglapi.so.0.
@Gnurou shall I create a pull request for the build-mesa script, which changes the RPATH?
chrpath -r /opt/nouveau/lib /opt/nouveau/lib/libgbm.so

I tried doing a fresh build, and weston-launch ran successfully. I am not sure what can trigger this issue.
@kratz00 , feel free to send a pull request, it would be harmless I think.

@Gnurou Just out of curiosity, how does the RPATH look for your nouveau_dri.so/libgbm.so files?
I will also do a fresh build and then create a pull request if necessary.

$ readelf -d nouveau_dri.so |grep RPATH
 0x0000000f (RPATH)                      Library rpath: [/home/gnurou/Work/tegra-nouveau-rootfs/out/target/L4T/usr/lib/arm-linux-gnueabihf:/home/gnurou/Work/tegra-nouveau-rootfs/out/target/L4T/opt/nouveau/lib:/usr/lib/arm-linux-gnueabihf:/opt/nouveau/lib]

Same as yours it seems - but I am not seeing your error. The only explanation seems to be that the Ubuntu package was defective for a short time.
Still I think we have a problem, the libraries looked up by nouveau_dri.so are not the right ones:
$ ldd nouveau_dri.so
...
libdrm_nouveau.so.2 => /usr/lib/arm-linux-gnueabihf/libdrm_nouveau.so.2 (0xb679d000)
libdrm.so.2 => /usr/lib/arm-linux-gnueabihf/libdrm.so.2 (0xb678d000)

I made some script (https://gist.github.com/kratz00/99533ce856a4d998b44a) to check the RPATHs of all the shared library files in /opt/nouveau/lib.
Some of the libraries contain paths of the build host, which I would say is not nice but harmless
and then there is the major problem that /usr/lib/arm-linux-gnueabihf comes before /opt/nouveau/lib.
I have identified three libraries with this problem:

dri/nouveau_dri.so
libgbm.so
libGL.so

A quick hack would be do add chrpath calls for these libraries in the build-mesa build script.

Are we still having this issue? I did a fresh build and things are working without any issue AFAICT.

I think rpath is at least somewhat "evil" and should really be rpath-link instead.  Also, setting the proper path/libs in ld.conf.d would be the right approach to runtime linking.  I'm just throwing out a common fix we do on the OS/packaging side (I have not tried the full tegra-rootfs yet, but we're in the process of migrating the right bits to Gentoo now (see gentoo-arm overlay).

I really cannot repro this issue. Besides I will be switching the scripts to support Arch Linux by default (Ubuntu/L4T's packages are too old to support latest Xorg/Weston), so I don't think it will apply anymore. Closing this issue for now.


Phpunit test using a remote php interpreter(from a docker container) returns a connection timed out

Info:

Docker version ($ docker --version):  Docker version 18.03.1-ce, build 9ee9f40
Laradock commit ($ git rev-parse HEAD):  f919979c9ba872da61378f0b46525603d0b5430f
System info (Mac, PC, Linux):  Linux
System info disto/version: Ubuntu 18.04 LTS

Issue:
Having connection timed out when trying to do a PHPUnit test from PHP-fpm container
I am using different DBs for local and testing environments. The IP of my MySQL container is <IP_ADDRESS>  and I don't have any issues running my main app.

Expected behavior:
Should be able to run my tests

Reproduce:

https://www.youtube.com/watch?v=I7aGWO6K3Ho <-- should be enough to reproduce it.

Relevant Code:
phpunit.xml
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="bootstrap/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="true">
    <testsuites>
        <testsuite name="only_fast_tests">
            <directory>./tests/Feature/fast</directory>
        </testsuite>
        <testsuite name="Feature Tests">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>

        <testsuite name="Unit Tests">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">./app</directory>
        </whitelist>
    </filter>
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
        <env name="DB_CONNECTION" value="app_testing"/>
    </php>

</phpunit>

database.php
     'app_testing' => [
            'driver' => 'mysql',
            'host' => env('DB_TESTING_HOST', '<IP_ADDRESS>'),  // <IP_ADDRESS>
            'port' => env('DB_PORT', '3306'), // 3306
            'database' => env('DB_TESTING_DATABASE', 'forge'), // app_testing
            'username' => env('DB_USERNAME', 'forge'), // root
            'password' => env('DB_PASSWORD', ''), // secret
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => 'InnoDB'
        ],

A sanity check from inside the PHP-fpm container:
ping mysql
PING mysql (<IP_ADDRESS>) 56(84) bytes of data.
64 bytes from laradock_mysql_1.laradock_backend (<IP_ADDRESS>): icmp_seq=1 ttl=64 time=0.134 ms

docker://laradock_php-fpm:latest/php /opt/project/vendor/phpunit/phpunit/phpunit --configuration /opt/project/phpunit.xml /opt/project/tests/Feature/fast --teamcity
PHPUnit 7.1.5 by Sebastian Bergmann and contributors.

Doctrine\DBAL\Driver\PDOException : SQLSTATE[HY000] [2002] Connection timed out

P.S. I've using Phpstorm to setup remote PHP-interpreters etc, to run tests.. etc.
P.S.S I've tried the same setup, but just with MySQL being local not in a docker container which worked, but MySQL to be in a container as well (for dev reasons).

Actually turns out was pointing to a bad env variable....

Actually turns out was pointing to a bad env variable....

I have the host as mysql but I am still having the same issue.

I'm getting this error too.
Illuminate\Database\QueryException : SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known
when i run tests from phpstorm I'm getting this. But i didn't get this when i run from terminal like phpunit Tests\ExampleTest


Recursive register on registered fails

Hello,
I write this lines to ask if someone has got a simliar problem like me and how can i try to solve it...
I use this plugin for register users in GCM for Android, and I call the register function every time that the user opens the apk for prevent some errors. But it isn't still enough, because after to get the token, I call Amazon Web Services to obtain or register (if i haven't got it) a new endpoint in my Amazon application.
I need that this workflow works always because this endpoint is used to send push notifications using a database and I observed that sometimes the register function fails giving me a null endpoint... After tested the call to Amazon Web Services I've seen that it's correct so i think to call the register function every time that i have an errorCallback making the code recursive.
This will be a good idea or any idea to make the code works 100% to success register every time?
Thanks in advance,
Oriol
The code (resumed):
pushNotification.register(successHandler, errorHandler, {"senderID":"783684761403","ecb":"onNotificationGCM"});

$window.onNotificationGCM = function(e) {
                    switch( e.event )
                    {
                           case 'registered':
                                token = e.regid;
                                $window.localStorage.setItem('token', JSON.stringify(e.regid));
                                amazon();
                           break;
                    }
}

function errorHandler (error) {
                console.log(error);
                reregister();
           }

           function reregister(){
                console.log("Tornem a registrar, hi ha hagut error en el registre");
                pushNotification.register(successHandler, errorHandler, {"senderID":"783684761403","ecb":"onNotificationGCM"});		// required!
           }

I close this bug, I'll use the new push plugin (phonegap-plugin-push) waiting that this issue is not reproducet on it.


Mention try_strptime in strptime section of Date Format

https://duckdb.org/docs/sql/functions/dateformat#strptime-examples
Noted by a user on Discord
I agree that it makes sense to refer to try_strptime here just to let readers know that it exists

Thanks, I mentioned it! :)


Add Rule Fails

I added a new manager rule to the pipeline and it is failing during the buildruletemplate phase. Below is the error message. I am not sure what I am missing here. I also have a copy of the json parameters file below.
[Container] 2019/07/09 16:39:21 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: rdk deploy -f --all > ../result.txt. Reason: exit status 1
{
"Version": "1.0",
"Parameters": {
"RuleName": "REQUIRED_TAGS",
"SourceRuntime": null,
"CodeKey": null,
"InputParameters": "{}",
"OptionalParameters": "{}",
"SourcePeriodic": "TwentyFour_Hours",
"SourceIdentifier": "REQUIRED_TAGS",
"RuleSets": "baseline"
},
"Tags": "[DefaultRuleSet]"
}

I was able to sort this out by adding the -s command with the rdk and adding the baseline ruleset. I had originally just modified the json parameters file. That didn't seem to work.


Feat/docs

The initial test build of the docs. No scripts are auto generating the function documentation yet, this is just to get it up onto vercel and get a build pipeline going.
Will continue to work of the feat/docs branch - just need this on main for vercel.

Pull Request Test Coverage Report for Build<PHONE_NUMBER>

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

Totals

Change from base Build<PHONE_NUMBER>:
0.0%

Covered Lines:
90

Relevant Lines:
271

💛  - Coveralls


Unable to install grpcio-tools on FreeBSD with pip in virtualenv

What version of gRPC and what language are you using?
gRPC version 1.21.1 in Python.
What operating system (Linux, Windows,...) and version?
FreeBSD 12.0-RELEASE amd64.
What runtime / compiler are you using (e.g. python version or version of gcc)
Language/Runtime: Python 3.6
Compiler: Clang 6.0.1 from FreeBSD 12.0 Base
What did you do?
Install grpc-tools from pip in a virtualenv.
What did you expect to see?
grpc-tools successfully installed from pip.
What did you see instead?
The following compile error:
[...]
    gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -fPIC -I. -Igrpc_root -Igrpc_root/include -Ithird_party/protobuf/src -I/usr/local/include/python3.6m -c third_party/protobuf/src/google/protobuf/stubs/common.cc -o build/temp.freebsd-12.0-RELEASE-amd64-3.6/third_party/protobuf/src/google/protobuf/stubs/common.o -std=c++11
    third_party/protobuf/src/google/protobuf/stubs/common.cc:48:2: error: #error "No suitable threading library available."
     #error "No suitable threading library available."
      ^~~~~
    error: command 'gcc' failed with exit status 1
    ----------------------------------------
ERROR: Command "/usr/home/neel/REDACTED/REDACTED/venv/bin/python3.6 -u -c 'import setuptools, tokenize;__file__='"'"'/tmp/pip-install-s4gog96c/grpcio-tools/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-8buz6l13/install-record.txt --single-version-externally-managed --compile --install-headers /usr/home/neel/REDACTED/REDACTED/venv/include/site/python3.6/grpcio-tools" failed with error code 1 in /tmp/pip-install-s4gog96c/grpcio-tools/

Keep in mind the REDACTED sections hide the project I'm working on, it's not open source (yet).
Anything else we should know about your project / environment?
grpcio-tools from FreeBSD Ports without a virtualenv works.

CC @nicolasnoble

Our current support for FreeBSD is "best effort". We don't test on the platform, so we have no way of verifying if it works or detecting regressions. With that said, pull requests are always welcome.
The FreeBSD ports are not maintained by the gRPC development team. You might try contacting<EMAIL_ADDRESS>


Allow to use static files instead of downloading them.

This is required for reproducable builds (aka builds without network access) as
it happens in build.opensuse.org instances.

This is more a RFC pull request, any other generic way how to support offline builds is of course also very welcome.
For an example how I use this look here:
https://build.opensuse.org/package/show/home:adrianSuSE:AppImage/rpm2appimage
esp. rpm2appimage.sh file

Thanks merged as-is for now. Let's collect some experience with it. I'm open for improvements, just let me know what you need.

@adrianschroeter would you be willing to integrate rpm2appimage.sh into the existing Recipe? (Yes, we need a better name for it, e.g., package2AppImage or something like that)

@probonopd yes, I also want to provide debian based builds in OBS which creates AppImages.
However, we would need to discuss some general design ideas to bring the different worlds (rpm vs deb, online vs. offline builds) together


[SPARK-40280][SQL][FOLLOWUP][3.3] Fix 'ParquetFilterSuite' issue

What changes were proposed in this pull request?

Why are the changes needed?
Fix 'ParquetFilterSuite' issue after merging #37747 :
The org.apache.parquet.filter2.predicate.Operators.In was added in the parquet 1.12.3, but spark branch-3.3 uses the parquet 1.12.2. Use Operators.And instead of Operators.In.

Does this PR introduce any user-facing change?

How was this patch tested?

@revans2 @cloud-fan @wangyum please take a review, thanks.

thanks for fixing @zzcclp  I should have built it on these before merging

@gengliangwang
This test failed.
[info] - SPARK-40389: Don't eliminate a cast which can cause overflow *** FAILED *** (227 milliseconds)
[info]   "The value<PHONE_NUMBER>BD of the type "DECIMAL(10,0)" cannot be cast to "INT" due to an overflow. Use `try_cast` to tolerate overflow and return NULL instead. If necessary set "spark.sql.ansi.enabled" to "false" to bypass this error." did not contain "[CAST_OVERFLOW]" (SQLQuerySuite.scala:4562)

@huaxingao Thanks for the ping. I will fix it.

Thanks @gengliangwang !

I will merge this PR since the test failure is not related to this PR.

@zzcclp Could you please update the PR description to fill all the required information? Thanks!

Merged to 3.3. Thanks @zzcclp for fixing this! Please remember to update the PR description.
Thanks @revans2 @tgravescs for reviewing!

@zzcclp Could you please update the PR description to fill all the required information? Thanks!

Done.


Is there a way to select the team id for the archive step in Xcode 11?

Question Subject
Is there a way to select the team_id for the archive step in Xcode 11?
Question Description
My scenario is this:
I have one project that is exported to different teams for different types of releases, in order to be app-store/test flight compatible the bundle id's are different in each release.
team1:  com.bundle_id.1
team2: com.bundle_id.2
Previously I was able to archive without selecting team, and export worked when the team was passed to gym. This is handled by export_team_id with gym.
now it seems the correct team id needs to be used in build settings when archiving, otherwise at the export step the bundle id is not found.
I've read through the gym documentation, searched issues with comparable terms, but I can't find this or can't seem to get this working, any suggestions, or does gym need to be updated to support this?
here is some redacted output from gym step where archive and export is attempted, you can see the archive successfully is created, which can be found, but if I open it in the organizer, the team field in the info on the right panel is wrong, its using team1 for com.bundle_id.2

Error Domain=IDECodesignResolverErrorDomain Code=1 "No signing certificate "iOS Distribution" found" UserInfo={IDEDistributionIssueSeverity=3, NSLocalizedRecoverySuggestion=No "iOS Distribution" signing certificate matching team ID "[TEAM_ID]" with a private key was found., IDEProvisioningError_UserInfoKey_IDEProvisioningErrorSpecifier=iOS Distribution, NSLocalizedDescription=No signing certificate "iOS Distribution" found, IDEProvisioningError_UserInfoKey_IDEProvisioningErrorPlatform=com.apple.platform.iphoneos, IDEProvisioningError_UserInfoKey_IDEProvisioningErrorAction=5, IDEProvisioningError_UserInfoKey_IDEProvisioningErrorTeam=<IDEProvisioningBasicTeam: 0x7fa77a26d260; teamID='[TEAM_ID]', teamName='(null)'>}

** EXPORT FAILED **
[10:24:49]: Exit status: 70

+---------------+-------------------------+
|            Build environment            |
+---------------+-------------------------+
| xcode_path    | /Applications/Xcode.app |
| gym_version   | 2.131.0                 |
| export_method | ad-hoc                  |
| sdk           | iPhoneOS13.0.sdk        |
+---------------+-------------------------+

[10:24:49]: ▸ Validate /Users/[USER]/Library/Developer/Xcode/DerivedData/[APP]/Build/Intermediates.noindex/ArchiveIntermediates/[SCHEME]/InstallationBuildProductsLocation/Applications/[BUNDLE_ID] (in target '[TARGET]' from project '[PROJECT]')
[10:24:49]: ▸     cd /[PATH]
[10:24:49]: ▸ ** ARCHIVE SUCCEEDED **
[10:24:49]:[10:24:49]:
[10:24:49]: Looks like fastlane ran into a build/archive error with your project
[10:24:49]: It's hard to tell what's causing the error, so we wrote some guides on how
[10:24:49]: to troubleshoot build and signing issues: https://docs.fastlane.tools/codesigning/getting-started/
[10:24:49]: Before submitting an issue on GitHub, please follow the guide above and make
[10:24:49]: sure your project is set up correctly.
[10:24:49]: fastlane uses `xcodebuild` commands to generate your binary, you can see the
[10:24:49]: the full commands printed out in yellow in the above log.
[10:24:49]: Make sure to inspect the output above, as usually you'll find more error information there
[10:24:49]:
[10:24:49]: Looks like no provisioning profile mapping was provided
[10:24:49]: Please check the complete output, in particular the very top
[10:24:49]: and see if you can find more information. You can also run fastlane
[10:24:49]: with the `--verbose` flag.
[10:24:49]: Alternatively you can provide the provisioning profile mapping manually

redacted fastlane env result:
🚫 fastlane environment 🚫
Stack

Key
Value

OS
10.14.5

Ruby
2.6.3

Bundler?
true

Git
git version 2.21.0 (Apple Git-122)

Installation Source
~/.rvm/gems/ruby-2.6.3/bin/fastlane

Host
Mac OS X 10.14.5 (18F132)

Ruby Lib Dir
~/.rvm/rubies/ruby-2.6.3/lib

OpenSSL Version
OpenSSL 1.1.1c  28 May 2019

Is contained
false

Is homebrew
false

Is installed via Fabric.app
false

Xcode Path
/Applications/Xcode.app/Contents/Developer/

Xcode Version
11.0

System Locale

Variable
Value

LANG
en_CA.UTF-8
✅

LC_ALL

LANGUAGE

fastlane files:
[redacted]
fastlane gems

Gem
Version
Update-Status

fastlane
2.133.0
✅ Up-To-Date

Loaded fastlane plugins:

Plugin
Version
Update-Status

fastlane-plugin-aws_s3
1.6.0
🚫 Update available

fastlane-plugin-badge
1.3.0
✅ Up-To-Date

Loaded gems

Gem
Version

did_you_mean
1.3.0

executable-hooks
1.6.0

bundler-unload
1.0.2

rubygems-bundler
1.4.5

bundler
1.17.3

etc
1.0.1

forwardable
1.2.0

CFPropertyList
3.0.1

concurrent-ruby
1.1.5

i18n
0.9.5

minitest
5.12.0

thread_safe
0.3.6

tzinfo
1.2.5

activesupport
<IP_ADDRESS>

public_suffix
2.0.5

addressable
2.7.0

httpclient
2.8.3

json
2.2.0

algoliasearch
1.27.1

rubyzip
1.3.0

apktools
0.7.1

atomos
0.1.3

aws-eventstream
1.0.3

aws-sigv4
1.1.0

jmespath
1.4.0

aws-sdk-core
2.11.362

aws-sdk-resources
2.11.362

aws-sdk
2.11.362

babosa
1.0.3

curb
0.9.10

fastimage
2.1.7

colored
1.2

highline
1.7.10

commander-fastlane
4.4.6

dotenv
2.7.5

emoji_regex
1.0.1

excon
0.67.0

multipart-post
2.0.0

faraday
0.15.4

unf_ext
<IP_ADDRESS>

unf
0.1.4

domain_name
0.5.20190701

http-cookie
1.0.3

faraday-cookie_jar
0.0.6

faraday_middleware
0.13.1

gh_inspector
1.1.3

jwt
2.1.0

memoist
0.16.0

multi_json
1.13.1

os
1.0.1

signet
0.11.0

googleauth
0.6.7

mime-types-data
3.2019.0904

mime-types
3.3

declarative
0.0.10

declarative-option
0.1.0

uber
0.1.0

representable
3.0.4

retriable
3.1.2

google-api-client
0.23.9

digest-crc
0.4.1

google-cloud-env
1.2.1

google-cloud-core
1.3.1

google-cloud-storage
1.16.0

mini_magick
4.9.5

multi_xml
0.6.0

plist
3.5.0

security
0.1.3

naturally
2.2.0

simctl
1.6.6

slack-notifier
2.3.2

terminal-notifier
2.0.0

unicode-display_width
1.6.0

terminal-table
1.8.0

tty-screen
0.7.0

tty-cursor
0.7.0

tty-spinner
0.9.1

word_wrap
1.0.0

claide
1.0.3

colored2
3.1.2

nanaimo
0.2.6

xcodeproj
1.12.0

rouge
2.0.7

xcpretty
0.3.0

xcpretty-travis-formatter
1.0.0

badge
0.11.0

fuzzy_match
2.0.4

nap
1.1.0

cocoapods-core
1.8.1

cocoapods-deintegrate
1.0.4

cocoapods-downloader
1.2.2

cocoapods-plugins
1.0.0

cocoapods-search
1.0.0

cocoapods-stats
1.1.0

netrc
0.11.0

cocoapods-trunk
1.4.1

cocoapods-try
1.1.0

escape
0.0.4

fourflusher
2.3.1

molinillo
0.6.6

ruby-macho
1.4.0

cocoapods
1.8.1

fastlane-plugin-aws_s3
1.6.0

fastlane-plugin-badge
1.3.0

fileutils
1.3.0

generated on: 2019-10-04

It seems like you have not included the output of fastlane env
To make it easier for us help you resolve this issue, please update the issue to include the output of fastlane env 👍

edited issue to include

Some images that help demonstrate the problem:
Organizer where the archive produced from gym has the wrong team id

Build setting that shows the team:

If changed this fixes the problem, but isn't automatable (without some less-than-pretty scripts to manually edit build settings)

Found the update_project_team action which sovles I think!
https://docs.fastlane.tools/actions/update_project_team/


Curried method silently dropped from query

I'm able to call #to_a on a relation that contains a curried relation method that has not received all of its arguments.
class Tasks < ROM::Relation[:sql]
  def for_user(user_id)
    where(user_id: user_id)
  end
end

class TaskRepo < ROM::Repository[:tasks]
  relations :sub_tasks

  def with_tasks(user_id)
    aggregate(many: sub_tasks).for_user.as(Task).to_a
  end
end

In this example, for_user is called without arguments and an argument is never supplied before to_a is called.
Runnable reproduction:

# frozen_string_literal: true

require 'rom'
require 'rom/sql'
require 'rom/repository'
require 'rom/repository/version'

ROM::VERSION             # => "3.0.1"
ROM::SQL::VERSION        # => "1.0.1"
ROM::Repository::VERSION # => "1.0.2"

class Tasks < ROM::Relation[:sql]
  schema(infer: true) do
    associations do
      belongs_to :user
      has_many   :sub_tasks
    end
  end

  def for_user(user_id)
    where(user_id: user_id)
  end
end

rom =
  ROM.container(:sql, 'sqlite::memory') do |conf|
    conf.gateways[:default].use_logger(Logger.new(STDOUT))

    conf.default.create_table(:users) do
      primary_key :id
      column :name, String, null: false
      column :email, String, null: false
    end

    conf.default.create_table(:tasks) do
      primary_key :id
      foreign_key :user_id, :users
      column :title, String, null: false
    end

    conf.default.create_table(:sub_tasks) do
      primary_key :id
      foreign_key :task_id, :tasks
      column :title, String, null: false
    end

    conf.relation(:users) do
      schema(infer: true) do
        associations do
          has_many :tasks
        end
      end
    end

    conf.register_relation(Tasks)
  end

class SubTask < Dry::Struct::Value
  attribute :id, Dry::Types['strict.int']
  attribute :task_id, Dry::Types['strict.int']
  attribute :title, Dry::Types['strict.string']
end

class Task < Dry::Struct::Value
  attribute :id, Dry::Types['strict.int']
  attribute :user_id, Dry::Types['strict.int']
  attribute :title, Dry::Types['strict.string']
  attribute :sub_tasks,   Dry::Types['strict.array'].member(SubTask)
end

class User < Dry::Struct::Value
  attribute :id,      Dry::Types['strict.int']
  attribute :user_id, Dry::Types['strict.int']
  attribute :title,   Dry::Types['strict.string']
  attribute :tasks,   Dry::Types['strict.array'].member(Task)
end

class TaskRepo < ROM::Repository[:tasks]
  relations :sub_tasks

  def with_tasks(user_id)
    aggregate(many: sub_tasks).for_user.as(Task).to_a
  end
end

rom.relations.users.insert(id: 1, name: 'John', email<EMAIL_ADDRESS>rom.relations.tasks.insert(user_id: 1, title: 'Learn ROM')
rom.relations.sub_tasks.insert(task_id: 1, title: 'Read docs')
rom.relations.sub_tasks.insert(task_id: 1, title: 'Fiddle')
rom.relations.sub_tasks.insert(task_id: 1, title: 'Ask questions in gitter')

rom.relations.users.insert(name: 'Jim', email<EMAIL_ADDRESS>rom.relations.tasks.insert(user_id: 2, title: 'Find bugs')
rom.relations.sub_tasks.insert(task_id: 2, title: 'Fiddle')

puts

repo = TaskRepo.new(rom)

p repo.with_tasks(1)
# >> [#<Task id=1 user_id=1 title="Learn ROM" sub_tasks=[#<SubTask id=1 task_id=1 title="Read docs">, #<SubTask id=2 task_id=1 title="Fiddle">, #<SubTask id=3 task_id=1 title="Ask questions in gitter">]>, #<Task id=2 user_id=2 title="Find bugs" sub_tasks=[#<SubTask id=4 task_id=2 title="Fiddle">]>]

Thanks for reporting this. I'll fix it in next version. I'm curious to know how you ended up with this?

I was running mutest on my Repository and noticed saw that it let me drop the argument. Didn't intend to actually use it this way

Hah fantastic :) I'll fix, thanks again

This now raises:
/Users/solnic/Workspace/rom-rb/rom/lib/rom/relation/curried.rb:42:in `call': curried Tasks#for_user relation was called without any arguments (ArgumentError)
        from /Users/solnic/Workspace/rom-rb/rom/lib/rom/relation/graph.rb:90:in `call'
        from /Users/solnic/Workspace/rom-rb/rom/lib/rom/relation/composite.rb:21:in `call'
        from /Users/solnic/Workspace/rom-rb/rom-repository/lib/rom/repository/relation_proxy.rb:51:in `call'
        from /Users/solnic/Workspace/rom-rb/rom/lib/rom/relation/materializable.rb:20:in `to_a'
        from tmp/repros/382.rb:82:in `with_tasks'


Rename symbol on variable "r" in python3 causes raw string identifier to be changed as well.

Issue Type: Bug
Enter in
r"test"
r = 0

F2 or right click to rename symbol r in the second line to "test". This results in
rtest"test"
test = 0

This should only change the symbol indicated, instead of appending 'test' to the prefix for the string.
VS Code version: Code 1.39.2 (6ab598523be7a800d7f3eb4d92d7ab9a66069390, 2019-10-15T15:35:18.241Z)
OS version: Windows_NT x64 10.0.17763

System Info

Item
Value

CPUs
AMD Ryzen 7 2700 Eight-Core Processor           (16 x 3194)

GPU Status
2d_canvas: enabledflash_3d: enabledflash_stage3d: enabledflash_stage3d_baseline: enabledgpu_compositing: enabledmultiple_raster_threads: enabled_onnative_gpu_memory_buffers: disabled_softwareoop_rasterization: disabled_offprotected_video_decode: unavailable_offrasterization: enabledskia_deferred_display_list: disabled_offskia_renderer: disabled_offsurface_synchronization: enabled_onvideo_decode: enabledviz_display_compositor: disabled_offwebgl: enabledwebgl2: enabled

Load (avg)
undefined

Memory (System)
15.93GB (9.76GB free)

Process Argv

Screen Reader
no

VM
0%

Extensions (4)

Extension
Author (truncated)
Version

vscode-django
bat
0.19.0

vscode-markdownlint
Dav
0.32.0

todo-tree
Gru
0.0.162

python
ms-
2019.11.50794

Similar (but not identical) bug found in f-string handling:
f"test"
f = 0

maps to
test"test"
test = 0

In this case, the renamed 'f' is replaced, rather than appended, but this is still unwanted behavior.

Please file the issue against the Python extension.


Flags from structures

I’m quite not sure if this is nicely doable with golang, because we have nothing like a procedural macro for it. It could be done with reflection and tags…
Anyways, here comes the idea: I saw in the upcoming release of clap (a command line parser for Rust) that it is capable of deriving the flags from a structure, like this:
#[derive(Clap)]
#[clap(
    after_help = "More info at: https://github.com/saschagrunert/kubernix",
    author = "Sascha Grunert<EMAIL_ADDRESS>    raw(global_setting = "AppSettings::ColoredHelp"),
    raw(version = "crate_version!()")
)]
/// The global configuration
pub struct Config {
    #[get = "pub"]
    #[clap(subcommand)]
    /// All available subcommands
    subcommand: Option<SubCommand>,

    #[get = "pub"]
    #[clap(
        default_value = "kubernix-run",
        env = "KUBERNIX_RUN",
        global = true,
        long = "root",
        short = "r",
        value_name = "PATH"
    )]
    /// Path where all the runtime data is stored
    root: PathBuf,

    …
}

The amazing thing is now that I’m able to use a single configuration structure and map it directly to command line arguments. So there is no need of an additional structure any more. The documentation comments (starting with ///) are automatically transferred into the help message as well.
I would like to spin up the discussion if we are considering something like this for this library, too. What do you think?

I've also done it here, feel free to pull in, I could make a PR for this repo if that's of interest http://github.com/Southclaws/clive

This would actually be a nice addition, has it been considered at all?

The way I see it urfave/cli gives you the basic building blocks. User could use reflection and tags and build the necessary flag slice for commands. I like this feature but I'd rather not have the cli library do it directly


[dcc32 Error] E1026 File not found: '..\SvgIconImageListSplash.res'

Hello,
Please note that the last version still reporting:
[dcc32 Error] E1026 File not found: '..\SvgIconImageListSplash.res'
Best regards.

Sorry, but SvgIconImageListSplash.res is a file of another project of mine: SvgIconImageList, and this file was added into this project last week.

Same problem:
[dcc32 Error] E1026 File not found: '..\SvgIconImageListSplash.res'
[dcc32 Error] E1026 File not found: '..\StyledComponentsSplash.res'
[dcc32 Error] E1026 File not found: '..\SvgIconImageListSplash.res'
[dcc32 Error] E1026 File not found: '..\StyledComponentsSplash.res'

unit SVGIconImageRegister;

interface

{$INCLUDE ..\Source\SVGIconImageList.inc}
{$R ..\SvgIconImageListSplash.res}

unit Vcl.StyledComponentsRegister;

interface

{$INCLUDE ..\Source\StyledComponents.inc}
{$R ..\StyledComponentsSplash.res}

they should be replaced by:
unit Vcl.StyledComponentsRegister;

interface

{$INCLUDE ..\Source\StyledComponents.inc}
{$R ..\Packages\StyledComponentsSplash.res}

unit SVGIconImageRegister;

interface

{$INCLUDE ..\Source\SVGIconImageList.inc}
{$R ..\Packages\SvgIconImageListSplash.res}

Which version of Delphi are you using? And what project are you compiling?


chip-tool missing command support for floats/structs in commands

false

https://github.com/project-chip/connectedhomeip/blob/f0f5de0d79ae1c51d7fddbf70900ebac0acd899a/examples/chip-tool/templates/commands.zapt#L523-L528

This issue was generated by todo-issue based on a TODO comment in f0f5de0d79ae1c51d7fddbf70900ebac0acd899a.

Renamed after looking at code. This is a template issue for the chip-tool template.

Done.


Support Kerberos error event

Codecov Report
Patch has no changes to coverable lines.
:exclamation: Your organization needs to install the Codecov GitHub app to enable full functionality.

Files Changed
Coverage

src/ingest/network.rs
0.00%

:loudspeaker: Thoughts on this report? Let us know!.


Testing is Done Right

Hi,
My comment is about: https://redux-saga.github.io/redux-saga/docs/advanced/Testing.html
I think the way you see testing sagas is wrong and puts emphasis on exact 'implementation', and not 'result'.
The way you do tests: Check the call for each 'yield', and muck a return value to that yield. In this case if I change the implementation of my saga (in such a way that doesn't affect the results), I need to change me tests. Any refactoring of code will necessarily mean changing the tests.
My view is that your tests check that you implemented your saga in a very very specific way and not that the saga is doing what it needs to be doing.
The way we write test for our sagas is:

Set up a test store with a specific scenario. Test store includes a reducer that interacts with actions that are fired by the saga.
Run the saga using the standard redux-saga framework.
See the side effects (actions that were sent).

I think this way of testing puts the emphasis where it needs to be. If we refactor the saga, and it still does exactly what it needs to do, the tests won't need to change (making the tests helpful for refactoring).
WDYT?

I kinda feel the same. In my tests I wouldnt like to focus on underlaying implementation, just like in the 'normal' code. For that reason I'm not even testing my sagas right now. Dont want to have my tests broken if I rearrange 2 lines which dont even change the overall behaviour

It's like other tests: do you want to unit-test the details of your code, or do you want to do integration tests of the behavior of the saga and your store, without having to deal implementation details.
I've always felt doing blackbox testing is a superior idea, as testing implementation details means that changing implementation details will likely break tests.
For example, do you want to test your classes that are used to build a REST API, or do you want to test the API directly? Personnally I think it's better to test the API directly, and don't care that much about unit tests, except rare cases where it's worth it because the function to test is likely complex and not going to change (like date/math utilities...)
I guess the subject is also quite related to new debates we've seen on twitter that say it's not really worth it to test React component outputs because when changing React component it will always break the test. That's probably why Jest's snapshot testing feature is gaining interest of the community
If redux-saga gives you good testability for yielded effects, it does not mean you have to test all your code in this fashion.

I'll make sure to open-source our redux-saga testing infrastructure soon.
Basically what we wrote is a component that you construct with full initial "state", an optional list of reducers (for more complex tests), and the sagas you need (including the tested one). Then our tests look like:
const tester = new SagaIntegrationTester({state, reducers, sagas}).
tester.put(someAction());
return tester.waitForAction(types.FINAL.ACTION).then(action => {
   expect(action.params).to.deep.equal(...);
   expect(tester.state).to.deep.equal(finalState);
})

@3LOK sounds awesome, please keep us informed!

@3LOK Patiently awaiting to hear back from you. I'm not pleased with the current way I have to test my sagas... :(

Hi all,
Here we go: https://www.npmjs.com/package/redux-saga-tester
Let me know what you think.

I agree with @slorber, redux saga is providing you a means to unit test a saga whereas you want to test how the saga integrates with your actions, reducers, etc. At that point you might as well go for a full end to end test because that's effectively the goal you are attempting to accomplish.

@neurosnap I disagree - 'testing that you wrote specific lines of codes' is not unit-test.
Here's an example: Lets say I have a function:
function foo(params) {
    var a = params.a;
    var b = params.b;
    return a + b;
}

Now I have excellent unit test for this function. One day, I decide to change the order of the two 'var' lines - you'll agree with me that the unit test should not break - the function still does exactly what you'd expect it to do, right?
But if we see this as a saga:
var a = yield select(aSelector);
var b = yield select(bSelector);
yield put(actions.Result(a+b));

If I were to unit test your way, and now change the order of the two vars, the unit test will fail although the unit still does exactly what it's supposed to be doing (!). That's a clear sign of a bad unit test. This means that the unit test is specific for my specific implementation (implementation = line of codes) - that's not a good unit test. In your case - you might as well just write the same code twice, and use 'diff' - it is effectively the goal you are attempting to accomplish.
For redux-saga, the store and the actions are the inputs and outputs of the saga. To unit-test the saga is to give it different inputs (different stores), and to see its outputs (different actions). It's not the end-to-end test at all (eg. I'm not giving it a real store, or real reducers - just the ones that simulate the test).
My type of unit test allow me to refactor the code and still know it does exactly what it's supposed to do, without needing to rewrite the tests.

You make a good point, @3LOK the order of selectors shouldn't change the outcome of the test.  It seems more accurate to say that the conventional approach to unit testing sagas is actually to unit test the saga effects, rather each iteration of the generator.  Basically with your library, you prepare a mock state, mock reducers, and dispatching a series of actions to determine if the saga dispatches the correct effects, is that correct?

@neurosnap yup, exactly.

@3LOK How do you handle call effects? are call effects executing the real functions?

@yelouafi call effects are executed (since our testing infrastructure uses redux-saga to execute the saga), however we never call the 'real functions' in our unit-testing. All our sagas are initialized with the libraries they use, we never directly 'require' (or 'import') the libraries from the saga (as a rule for TDD):
Here's an example of our Feedback saga:
    export default function* feedbackRootSage(libraries) {
        yield [
            fork(waitForFeedback.bind(null, libraries))
        ];
    }

    function* waitForFeedback(libraries) {
        yield* takeEvery(types.FEEDBACK, handleFeedback.bind(null, libraries));
    }

    function* handleFeedback(libraries, action) {
        const {WixRestaurantsApi} = libraries;
        const {payload} = action;

        try {
            yield call(WixRestaurantsApi.sendFeedback, {
                accessToken:payload.accessToken,
                feedback:payload.feedbackRequest
             });
             yield put(actions.feedbackSent());
        } catch (e) {
             yield put(actions.feedbackError(e));
        }
    }

As you can see, during testing we can simply initialize the saga with mock libraries (for example a mock WixRestaurantsApi) and simulate different results.

I guess I'll be the voice of dissension :)
While I admit that unit testing sagas necessarily ties the tests to the implementation, I can now make guarantees on the effects my saga deals with. I'm not only interested in the actions it dispatches. What if I care which API calls it makes? What if I care what arguments the call descriptor passes to my API functions?
Of course I love dependency injection (i.e. passing in the libraries that my saga will use), but I want to know that it uses the libraries correctly. Sure, I could create spies/mocks and assert that they're called with certain arguments, but then why bother using sagas? I can use spies with thunks. I want to test with as few spies and mocks as possible.
Reusing this example:
    function* handleFeedback(libraries, action) {
        const {WixRestaurantsApi} = libraries;
        const {payload} = action;

        try {
            yield call(WixRestaurantsApi.sendFeedback, {
                accessToken:payload.accessToken,
                feedback:payload.feedbackRequest
             });
             yield put(actions.feedbackSent());
        } catch (e) {
             yield put(actions.feedbackError(e));
        }
    }

Maybe it's personal preference or being overly anxious, but I would like to know that the sendFeedback function is called with the correct arguments. I also write some sagas intentionally such that ordering IS important. So for me, I want to test that ordering.
(Aside: Even my react tests take a hybrid unit testing approach along with snapshots because I'm not convinced snapshots are enough. If my component uses certain props, then I'd like to see those represented in the rendered output. If I'm writing stateless components with functions, then passing in props should result in a certain type of output based on those props. How is that any different from a normal pure function? Should I snapshot all my normal functions then too and just hope the initial snapshot is producing the correct result?)
I agree that refactoring a saga can be slightly annoying for unit testing, which is why I created redux-saga-test-plan. It has helped tremendously for testing and refactoring sagas, so fixing a test isn't that big of a deal for me personally.
Maybe I'm reading too much into it, but if I think about sagas as something similar to IO monads (#505), then they are similar-ish to compositions of function calls. I'd more than likely test the individual composed functions, so why should a saga be any different for testing?
So far, I haven't been burnt by this testing strategy for the project I've been working on. I have found more value and produced fewer bugs by just unit testing react, redux, and redux saga on this project, so I'm not convinced that I need integration testing.
Realistically, I think testing will be a subjective practice no matter how much we analyze it. Ultimately the testing strategy has to align with the goals of the business, the size of the team, and the pace of development of the product. For some teams, taking a more wholistic, integration testing approach might be better. For us, we've found unit testing more valuable. So maybe both testing approaches need to represented in the documentation along with the pros and cons and what each approach focuses on achieving.

I don't know if I even intend to continue the project on my own, but if anyone is interested here is my experiment: https://gitlab.com/AsaAyers/redux-saga-tester. I did also publish it on npm if you'd like to try it out.
The core concept is that it wraps around a specific saga and intercepts all calls. It has a real store like @3LOK 's redux-saga-tester, but it also gives you the ability to intercept calls like you do by examining the generator output. If you're testing the output of a generator, I think it's nice to be able to write your test as a generator.

Toy Example
This test is also available in the repo
export function* addSaga() {
    const a = yield select(selectA)
    const b = yield select(selectB)
    const total = yield call(sum, a, b)
    yield put({
        type: "RESULT",
        payload: total
    })
}

test("add-saga", () => {
    const tester = SagaTester({
        initialState: {
            a: 2,
            b: 3,
        },
        reducer,
    })
    tester.testAgainst(addSaga, function* ({ getState }) {
        let actual
        // yield gives you the next effect from your saga that you want to test.
        // This didn't care about the selectors, they execute normally.
        actual = yield
        expect(actual).toEqual(call(sum, 2, 3))
        const callSumResult = 5
        // You need to yield a result back to the saga to continue and pick up
        // the next significant effect.
        actual = yield callSumResult
        // END is a special value automatically emitted when/if your saga ends
        expect(actual).toBe(END)
        // Instead of verifying the action was fired, now verify the state.
        actual = selectResult(getState())
        expect(actual).toBe(callSumResult)
    })
})

The main problem I ran into was figuring out what to do with fork and call. Should I try to intercept fork / call effects, figure out if it's calling a generator and then also intercept that generator's calls?

@jfairbank @axelson @AsaAyers
For me tests are relevant in the long run if I don't need to change them as long as I don't completely change the logic of the code. As long as the code should perform the same logic, as long as I fix bugs, refactor, and add new logic - the existing tests shouldn't change (just add new tests). Why? Because changing tests increases drastically the chances of introducing bugs in the tests which increases drastically the chances of introducing bugs in the code, and that beats the entire purpose for which I am writing tests (to make sure my code works the same in the long run).
Testing as described in the documentation simply doesn't follow that rule. Basically any change I do in the original code requires changing tests (since they are so binded together), and I think that's simply wrong in a continuous changing live code.
In the very very very rare cases where ordering of ```yieldszzz is important to you, that case be tested as well using our redux-saga-tester.
In regards to testing call effects, I do think our solution works best.
Here's an example of a small test (at the bottom you can see the partial saga I've tested - please disregard me not using selectors. I can share the entire saga and test if requested). See the test of api.sendDeleteRequest for an example of a call effect test (including testing the correct parameters were called):
The Test

describe('DeleteSaga', () => {

    let sagaTester = null;
    let apiMock = null;

    beforeEach(() => {

        apiMock = {
            sendDeleteRequest: sinon.promise()
        }

        const initialState = {
            session:{
                screen:'list'
            },
            list: {
                data:[
                    'mydata1',
                    'mydata2',
                    'mydata3'
                ]
            }
        };

        sagaTester = new SagaTester({
            initialState,
        });

        sagaTester.start(DeleteSaga.bind(null, {api: apiMock}));
    });

    it('should return delete list index and return to main screen when users selects "yes" in the yes/no screen', () => {
        // User pressed delete
        sagaTester.dispatch(DeleteActions.actions.request({itemIdx:1}));

        // screen should be 'yes/no'
        expect(sagaTester.getLastActionCalled()).to.deep.equal([SessionActions.actions.screenAreYouSure()]);

        // user presses 'yes'
        sagaTester.dispatch(DeleteActions.actions.areYouSureYes());

        // screen should be thinking
        expect(sagaTester.getLastActionCalled()).to.deep.equal([SessionActions.actions.screenThinking()]);

        // server returns success
        expect(apiMock.sendDeleteRequest.args[0][0]).to.deep.equal({itemIdx:1});
        apiMock.sendDeleteRequest.resolve();

        // list should be updated, and screen should go back to the main screen
        expect(sagaTester.getLastActionCalled(2)).to.deep.equal([
            ListActions.actions.update({data:['mydata1', 'mydata3']}),
            SessionActions.actions.screenList()
        ]);
    });
});

The Saga
function* onDelete(clients, action) {

    const {itemIdx} = action.payload;

    yield put(SessionActions.actions.screenAreYouSure());

    const answer = yield take([
        DeleteActions.types.ARE_YOU_SURE_NO,
        DeleteActions.types.ARE_YOU_SURE_YES
    ]);

    if (answer.type === DeleteActions.types.ARE_YOU_SURE_NO) {
        yield put(SessionActions.actions.screenList());
        return;
    }

    yield put(SessionActions.actions.screenThinking());

    try {
        yield call(clients.api.sendDeleteRequest, {itemIdx});
    } catch(e) {
        yield put(SessionActions.actions.screenError({error:e.toString()}));
        return;
    }

    const list = _.cloneDeep(yield select(state => state.list.data));
    list.splice(itemIdx, 1);

    yield put(ListActions.actions.update({data:list}));
    yield put(SessionActions.actions.screenList());
}

@3LOK Isn't the test above also coupled (in a different manner) to the implementation. I don't mean it's bad thing. But that in the Saga example the ordering is still important except for the last 2 put effects.
If we change the Saga impl. and yield an array instead of the 2 last consecutive effects where the ordering doesn't matter.
function* onDelete(clients, action) {

    // ...
    yield ([
      put(ListActions.actions.update({data:list}));
      put(SessionActions.actions.screenList());
    ])
}

wouldn't the corresponding unit test be no so much different from the mock based version?

@yelouafi Indeed, I give this specifically as an example foe a call effect testing. Indeed since in this example every line is an output effect, order (flow) matters, and is tested. (and thank you for the improvement suggestion).
But also in this example, if you note, I can change the position of my select effect and the logic that comes with it, without needing to change my test at all. (i don't see a reason to do so, but I can :))
We have many 'logic sagas' (compared to this 'UX flow saga') that interact mainly interact with third party services and with the store, without importance to the order of the services (it gets X from Service1, Y from Service2, Z from the Store, does some calculation, and puts an action with f(X,Y,Z)). In these saga tests, the theories I've discussed come strongly into play and are very easily tested with the framework.

@axelson, I agree that put and call are the main items that should be tested.  They are the items which have an effect on the application.
take should be tested as well seeing as how it is what triggers the saga.  We want to test what triggers the saga.
select, then, is an input.  i.e. Given select(myData) yields { foo: 'bar' }, I expect call to myApi with some payload.

What I would like to see a sort of saga spy, which gives us the ability to write a test like this.
let sagaSpy;
beforeEach(() => {
  sagaSpy = spyOnSaga({
    saga: mySaga,
    selectors: {
      myData: () => myDataStub,
      token: () => stubToken,
    }
  });
});

it('is triggered by MY_ACTION', () => {
  sagaSpy.dispatchAction(myData);
  expect(sagaSpy.called).to.be.true();
});

context('when MY_ACTION is dispatched', () => {
  context('when myData is clean', () => {
    beforeEach(() => {
      sagaSpy = spyOnSaga({
        saga: mySaga,
        selectors: {
          myData: () => myCleanDataStub,
          token: () => stubToken,
        }
      });

      sagaSpy.dispatchAction(myData);
    });

    it('dispatches UPDATE action', () => {
      const updateAction = put(createUpdateAction({ foo: 'bar'}));
      expect(sagaSpy.getCall(0).puts(updateAction)).to.be.true();
    });
  });

  context('when myData is dirty', () => {
    beforeEach(() => {
      sagaSpy = spyOnSaga({
        saga: mySaga,
        selectors: {
          myData: () => myDirtyDataStub,
          token: () => stubToken,
        }
      });

      sagaSpy.dispatchAction(myData);
    });

    it('dispatches REFRESH action', () => {
      const refreshAction = put(createRefreshAction({ foo: 'bar'}));
      expect(sagaSpy.getCall(0).puts(refreshAction)).to.be.true();
    });

    it('calls refresh api', () => {
      const refreshAction = call(doRefresh, { token, foo: 'bar'});
      expect(sagaSpy.getCall(0).calls(refreshAction)).to.be.true();
    });
  });
});

Spent a little more time on this approach with the goal of having this api.
const spy = effectSpy(generator)
  .next('init')
  .next('getToken', token) // name and pass in yield values
  .next('getUpdatedFooBars', fooBars)
  .next('putFooBars');

// in beforeEach
mySpyRun = spy.run({
  getToken: 'invalid-token' // accepts overrides
});

// in `it` statement
expect(mySpyRun.getToken.value).to.deep.equal(select(getToken))
expect(mySpyRun.putFooBars.value)
  .to.deep.equal(put(fooBarsAction, fooBars))

The implementation is simple, I could turn this into a module if there's interest.
https://gist.github.com/jimbol/fe660007487e57a6e172ba26c3ada23b

Because there is a lot of interest in integration-type testing — and I do recognize some of the benefits too — I've started work on a new function in redux-saga-test-plan for allowing a more holistic testing approach. I'd appreciate ideas and comments over on the issue I'm using to track the feature: jfairbank/redux-saga-test-plan#37.

The main problem with some of these solutions is that when running the sagas using the middleware there's no way to prevent call effects to actually execute external logic. If we somehow had a way to mock the evaluation of these effects in the sagaMiddleware I think testing would be really simple
I don't think an external lib would be necessary. Right now redux-saga exposes a very useful runSaga function which allows you to monitor, but not alter, saga execution. If there were a middleware option for it that would allow us to return the resulting value of each effect (when needed) it should be possible
Example
function* mySaga() {
  yield take(ACTION_TYPE);
  const result = yield call(serverRequest);
  return `The server responded with ${result}`;
}

runSaga(mySaga(), {
  ...,
  middleware: (effect) => {
    // ideally check that the effect being yielded matches your criteria
    if (isEqual(effect, call(serverRequest)) {
      // when something is not an effect redux saga just returns whats yielded
      return 'mocked value';
    }
    // return original effect
    return effect;
  }
});

redux-saga-test-plan now supports an integration, BDD-style form of testing via the new expectSaga function. As others have pointed out, though, a middleware feature is very useful and something I plan to add next to help with mocking certain effects like call.
I'd appreciate feedback and any issues people can find with expectSaga. Since it's newer than the unit-testing testSaga function, there might be some bugs I haven't encountered yet. I also welcome more use cases and feature ideas at the repo.
import { call, put, take } from 'redux-saga/effects';
import { expectSaga } from 'redux-saga-test-plan';

function identity(value) {
  return value;
}

function* mainSaga(x, y) {
  const action = yield take('HELLO');

  yield put({ type: 'ADD', payload: x + y });
  yield call(identity, action);
}

it('works!', () => {
  return expectSaga(mainSaga, 40, 2)
    // assert that the saga will eventually yield `put`
    // with the expected action
    .put({ type: 'ADD', payload: 42 })

    // dispatch any actions your saga will `take`
    .dispatch({ type: 'HELLO' })

    // run it
    .run();
});

It looks really cool and promising. However im wondering how do you determine .dispatch() timing? I mean - are you detecting takes and then dispatching what's been registered?
I also need to check out how do you handle forked tasks, as that's what the most tricky part of the whole thing I guess.
Providing withStore wold be also cool, as it would allow even broader 'inegration' testing here, I think its not possible now to change the state in .put()'s response, so that later select would be correct if it depends on that part of the state.

Thanks @Andarist. This is probably not the cleanest, most optimal code yet, but it works for simple cases, including forks as you noticed.

However im wondering how do you determine .dispatch() timing? I mean - are you detecting takes and then dispatching what's been registered?

Right now, dispatches have to be in order, so that could get tricky with more complex sagas. Basically, it queues up actions from the dispatch method. Then, whenever it encounters a take it pops the first action in the queue and notifies listeners.

I also need to check out how do you handle forked tasks, as that's what the most tricky part of the whole thing I guess.

I'm using a custom IO with the sagaMonitor callbacks effectTriggered and effectResolved to store yielded effects as well as track outstanding fork effects by effect id. Once those forks resolve (i.e. we get a task in effectResolved), I push the task into an array and utilize Promise.all along with the main task's Promise and the forked tasks' Promises. There's a dirty check too in case a saga gets forked later on, so expectSaga can put off resolving and schedule resolution later on. It might not be the most elegant solution right now, but it works.

Providing withStore wold be also cool, as it would allow even broader 'inegration' testing here, I think its not possible now to change the state in .put()'s response, so that later select would be correct if it depends on that part of the state.

Yes, I already opened an issue for integrating with real Redux stores, so this would definitely be useful!

I have been working on this generator test runner for the past couple months that my team seems to enjoy for testing sagas/effects.  I laid out the API earlier in this thread.
I just added a match method, which allows you to define catch-alls for yielded values.
// In this example, all yields which meet the conditions of the `detectSelector` fn
// Will use the `callSelector` result instead of the normal iterator flow (using `runner.next()`)

// Returns true if step meets desired conditions, otherwise false
const detectSelector = (step: YieldedStep): boolean => {
  return step.value && step.value.SELECT;
};

// Returns argument to be passed into `step.next`
const callSelector = (step: YieldedStep): * => {
  return step.value.select.selector(); // call promise
};

sinon.stub(selectors, 'getToken').returns('fake-token');
sinon.stub(selectors, 'barIdsSelected').returns([ 1, 2, 3 ]);

run = genRunner(onArchiveThreads)
  .match('select', detectSelector, callSelector)
  .next('start')
  .next('finish')
  .run();

This way it doesn't matter the order that our selectors are called, but we can still test the order of things that we care about.

this one return step.value && step.value.SELECT; is reaching for rather private API, which should be avoided
and also i dont get why here return step.value.select.selector(); // call promise you are mentioning promises

Whoops, spy, not promise.
The selector detector could be any function, whatever makes the most sense!  So long as it returns a bool.  I would appreciate some advice on what is the best way to detect a selector from the yielded value.  Would you share a better way?

I dont get why then the API is:
 .match('select', detectSelector, callSelector)
I mean - what's the purpose of puting select string there? if it is not detected automatically under the head for the user is it smth more than a label? Is it used somethow?

Yes! We can get the steps off the run later for testing.
For match, you get an array of the yielded values
type Step = { next: Function, done: Boolean, value: * };
const run = genRunner(generator)
  .match('select', detect, callSelector)
  .run();

const steps: Array<Step> = run.get('select');
expect(steps[0].value).to.deep.equal(select(getThing));

For next, you get a single value this way.
const step: Step = run.get('finish');
expect(step.done).to.be.true();

What are your thoughts on snapshot testing sagas and effects?

There are some cases I conditionally yield on saga effects, and so I want to test both cases. This leads to repetition of unit tests, in order to reach that specific generator step where you handle this condition. Is it possible to write your unit tests by removing this repeated steps?

It is possible to do forking but I have found that forking a generator for testing purposes creates an unwieldy mess that is difficult to maintain.  We created a utility to make those arduous duplicated tests easier to deal with by making testing sagas virtually painless with https://github.com/jimbol/expect-gen
Using this utility we have reduced saga testing to be as easy as testing reducers.
function* myGen({ userId }) {
  const users = yield select(getUsers);
  const user = users[userId];
  yield put(registerUser(user));

  if (user.isAdmin) {
    yield put(showAdminPanel());
  }
}

// it should not trigger admin panel
const user = { id: 5, isAdmin: false };
expectGen(myGen, { userId: 5 })
  .yields(select(getUsers), { 5: user }) // asserts the select as first arg and provides the dummy data as second
  .yields(put(registerUser(user)) // assert
  .finishes() // generator.next().done = true
  .run();

// it should trigger admin panel, not bothering to assert what we already asserted
const user = { id: 5, isAdmin: true };
expectGen(myGen, { userId: 5 })
  .next({ 5: user }) // doesn't assert just goes to the next step with dummy data
  .next() // doesn't assert
  .yields(put(showAdminPanel()))
  .finishes()
  .run();

If our action creators return JSON serializable objects we can make this even easier with snapshot testing.  We don't need to worry about asserting that the correct actions are being dispatched if we create a snapshot.
const user = { id: 5, isAdmin: false };
const snapshot = expectGen(myGen, { userId: 5 })
  .next({ 5: user })
  .next()
  .finishes()
  .toJSON(); // converts results from generator to JSON serializable format

expect(snapshot).toMatchSnapshot();

const user = { id: 5, isAdmin: true };
const snapshot = expectGen(myGen, { userId: 5 })
  .next({ 5: user })
  .next()
  .next()
  .finishes()
  .toJSON();

expect(snapshot).toMatchSnapshot();

@kwnccc Of course I'm biased, but you can easily write this with redux-saga-test-plan with little duplication. Reusing the example saga that @neurosnap provided:
import { put, select } from 'redux-saga/effects';
import { expectSaga } from 'redux-saga-test-plan';

function* myGen({ userId }) {
  const users = yield select(getUsers);
  const user = users[userId];
  yield put(registerUser(user));

  if (user.isAdmin) {
    yield put(showAdminPanel());
  }
}

it('regular users cannot access admin panel', () => {
  return expectSaga(myGen, { userId: 5 })
    .provide([
      [select(getUsers), { '5': { isAdmin: false } }]
    ])
    .not.put(showAdminPanel())
    .run();
});

it('admins can access admin panel', () => {
  return expectSaga(myGen, { userId: 5 })
    .provide([
      [select(getUsers), { '5': { isAdmin: true } }]
    ])
    .put(showAdminPanel())
    .run();
});

@neurosnap I really like the above example, it seems to make testing sagas extremely concise. I will try to integrate your library in my tests and let you know. Testing against snapshots is really nice as a feature, is it also available in intermediate steps other than the last one? Or does the .toJSON() keeps a tree of all the steps until the saga is completed?

@kwnccc @neurosnap yes you can do snapshots on partial generator runs.

What do you all think about a simplistic approach like this?
import deepEqual from 'deep-equal'

const nextUntil = (gen, untilValue, value) => {
  let result = gen.next(value)
  while (!result.done) {
    if (deepEqual(result.value, untilValue)) return result
    result = gen.next()
  }
  return null
}

You can use this to test generator functions directly, similar to how @neurosnap's lib does.
Here's a practical example:
it('uses token from store to call someAuthenticatedRequest', () => {
  const gen = mySaga(action)
  expect(nextUntil(gen, select(getToken))).toBeTruthy()
  const token = 'harrypotterandthesorcererstoken'
  expect(nextUntil(gen, call(someAuthenticatedRequest, token), token)).toBeTruthy()
})

I agree with those who say the testing recommended in the official documentation is pointless.
To make my tests implementation agnostic I'm using Jest's async/await capabilities along with a mock store which just keeps a log of actions. This might need some tweaking if your sagas trigger timers.
import { createStore, applyMiddleware } from 'redux';
import createSagaMiddleware from 'redux-saga';
import api from '.path/to/api/service';
import saga from './path/to/sagas';

function mockStore(rootSaga) {
  const sagaMiddleware = createSagaMiddleware();
  const actionReducer = (state, action) =>
    action.type === '@@redux/INIT' ? [] : [...state, action];
  const store = applyMiddleware(sagaMiddleware)(createStore)(actionReducer);
  sagaMiddleware.run(rootSaga);
  return store;
}

describe('suite', () => {
  it('test', async () => {
    const store = mockStore(saga);
    api.someCall = jest.fn(api.someCall);

    api.mockResponse('some response');

    store.dispatch({
      type: 'SOME_ACTION',
      id: 123
    });

    await Promise.resolve();

    const actual = store.getState();
    const expected = [
      { type: 'SOME_ACTION', id: 123 },
      { type: 'SOME_OTHER_ACTION', payload: 'some response' }
    ];

    expect(actual).toEqual(expected);
    expect(api.someCall).toHaveBeenCalledWith(123);
  });
});

A contrived mimic of the official testing example would be
function calc(a, b) {
    return a + b
}

test('calc', () => {
    const spy = mock('+') /* suppose we can do this */
    calc(1, 2)
    expect(spy).toBeCalledWith(1, 2)
})

while the actual test I want to perform is:
test('calc', () => {
    expect(calc(1, 1)).toEqual(2)
    expect(calc(1, 2)).toEqual(3)
})

IMO the first way of testing is just the same logic duplicated in tests.

@3LOK Do you have an example on how to properly test saga (if at all) without the silly overhead that was discussed here?

Hey everyone.  A lot has changed since this GH issue was originally posted.  The FE ecosystem has moved slowly into the full-blown integration test paradigm where end-developers are asked to leverage something like msw and test side-effects alongside their UI.
I'd be more than happy to continue this conversation and we do plan on writing documentation that nudges people into performing integration tests instead of testing sagas in isolation.
Closing this issue for now, but please feel free to post here and I'll reopen.


⚠ Jenkins Plugins Artifactory has degraded performance

In 92c734b, Jenkins Plugins Artifactory (https://get.jenkins.io/plugins/artifactory/) experienced degraded performance:

HTTP code: 200
Response time: 1212 ms

Resolved: Jenkins Plugins Artifactory performance has improved in 7d7967a after 12 minutes.


Namespace issues with sourced tcl files

With the recent change to use namespaces, helper files (e.g. env.tcl) are being evaluated in the cucumber namespace, which is going to cause problems with things like package require, which should be evaluated in the global scope

I've submitted a pull request that will source Tcl files into the global namespace.


Openshift Ghost Update

Hi, i want to ask when openshift updates Ghost does my content get lost? i.e if i put another theme or the changes i make in the database file do get updated also after a general Ghost update?
Thank you

quickstart has been updated to 0.5.10


Cb 2.51.0 merge

See detailed description in the commit message.

Closed this PR and opened a new one with merge conflicts resolved.


New hiredis fails to compile on Windows

I started working on upgrade of hiredis in hiredis-py to new version of hiredis (from master branch) and while it compiles well on Linux & macOS then I have a problem on Windows. Stack trace from compilation:
c:\projects\hiredis-py\vendor\hiredis\sds.h(46) : error C2061: syntax error : identifier 'sdshdr5'
c:\projects\hiredis-py\vendor\hiredis\sds.h(46) : error C2059: syntax error : ';'
c:\projects\hiredis-py\vendor\hiredis\sds.h(46) : error C2449: found '{' at file scope (missing function header?)
c:\projects\hiredis-py\vendor\hiredis\sds.h(49) : error C2059: syntax error : '}'
c:\projects\hiredis-py\vendor\hiredis\sds.h(56) : error C2061: syntax error : identifier 'sdshdr16'
c:\projects\hiredis-py\vendor\hiredis\sds.h(56) : error C2059: syntax error : ';'
c:\projects\hiredis-py\vendor\hiredis\sds.h(56) : error C2449: found '{' at file scope (missing function header?)
c:\projects\hiredis-py\vendor\hiredis\sds.h(61) : error C2059: syntax error : '}'
c:\projects\hiredis-py\vendor\hiredis\sds.h(68) : error C2061: syntax error : identifier 'sdshdr64'
c:\projects\hiredis-py\vendor\hiredis\sds.h(68) : error C2059: syntax error : ';'
c:\projects\hiredis-py\vendor\hiredis\sds.h(68) : error C2449: found '{' at file scope (missing function header?)
c:\projects\hiredis-py\vendor\hiredis\sds.h(73) : error C2059: syntax error : '}'
c:\projects\hiredis-py\vendor\hiredis\sds.h(103) : error C2054: expected '(' to follow 'inline'
c:\projects\hiredis-py\vendor\hiredis\sds.h(103) : error C2085: 'sdsavail' : not in formal parameter list
c:\projects\hiredis-py\vendor\hiredis\sds.h(103) : error C2143: syntax error : missing ';' before '{'
c:\projects\hiredis-py\vendor\hiredis\sds.h(129) : error C2054: expected '(' to follow 'inline'
c:\projects\hiredis-py\vendor\hiredis\sds.h(129) : error C2085: 'sdssetlen' : not in formal parameter list
c:\projects\hiredis-py\vendor\hiredis\sds.h(129) : error C2143: syntax error : missing ';' before '{'
c:\projects\hiredis-py\vendor\hiredis\sds.h(153) : error C2054: expected '(' to follow 'inline'
c:\projects\hiredis-py\vendor\hiredis\sds.h(153) : error C2085: 'sdsinclen' : not in formal parameter list
c:\projects\hiredis-py\vendor\hiredis\sds.h(153) : error C2143: syntax error : missing ';' before '{'
c:\projects\hiredis-py\vendor\hiredis\sds.h(179) : error C2054: expected '(' to follow 'inline'
c:\projects\hiredis-py\vendor\hiredis\sds.h(179) : error C2085: 'sdsalloc' : not in formal parameter list
c:\projects\hiredis-py\vendor\hiredis\sds.h(179) : error C2143: syntax error : missing ';' before '{'
c:\projects\hiredis-py\vendor\hiredis\sds.h(196) : error C2054: expected '(' to follow 'inline'
c:\projects\hiredis-py\vendor\hiredis\sds.h(196) : error C2085: 'sdssetalloc' : not in formal parameter list
c:\projects\hiredis-py\vendor\hiredis\sds.h(196) : error C2143: syntax error : missing ';' before '{'
vendor/hiredis/read.c(77) : warning C4013: 'snprintf' undefined; assuming extern returning int
vendor/hiredis/read.c(121) : warning C4267: 'initializing' : conversion from 'size_t' to 'int', possible loss of data
vendor/hiredis/read.c(211) : warning C4146: unary minus operator applied to unsigned type, result still unsigned
vendor/hiredis/read.c(227) : warning C4267: '=' : conversion from 'size_t' to 'int', possible loss of data
vendor/hiredis/read.c(313) : warning C4267: '=' : conversion from 'size_t' to 'unsigned long', possible loss of data
vendor/hiredis/read.c(336) : warning C4244: '+=' : conversion from '__int64' to 'unsigned long', possible loss of data

On Python 2.7 build we have this problem:
c:\projects\hiredis-py\vendor\hiredis\sds.h(40) : fatal error C1083: Cannot open include file: 'stdint.h': No such file or directory

PR that I'm referring to:
https://github.com/redis/hiredis-py/pull/66
AppVeyor build:
https://ci.appveyor.com/project/badboy/hiredis-py/build/51
Thanks for any help

Hey, thanks for the report.
Disclaimer:  I haven't developed on Windows in many years so take this with a grain of salt.
I don't know if there is a simple way to solve these problem(s).  It looks like MSVC is choking on the added __attribute__ ((__packed__)) declarations in the updated sds.h library and according a bit of googling it looks like there aren't really clean ways to solve it.
A couple of solutions are described in this StackOverflow question, but that leads to a separate issue where Hiredis and Redis will have diverging sds implementations.
Regardless I'll look into it a bit more and see if any of the above solutions are reasonable.

Thanks @michael-grunder for looking into that.
I don't have any significant experience with C, so I can't help with that. If there is anything I can test or give feedback let me know.

Most likely it's actually the missing stdint.h header. Python 2.7 uses an ancient version of MSVC (I believe 2008?) to compile it; that version of MSVC (and all versions up to 2013) lack support for C99. There are some additional add-on headers that can be used in its stead, though.

Is Windows compatibility still a goal for us?

@michael-grunder Using PACK macro as described here https://stackoverflow.com/a/3312896 looks quite reasonable for hiredis.

Just to chime in... I think that support for Windows (ideally at least MSVC and MinGW) should be natural for a project like hiredis, especially as it's considered the "the official C client" for redis (according to the redis.io homepage).
Since Travis-CI now has support for building on Windows, it should make it easier to prevent platform breakage (even if most hiredis developers don't use Windows).
(I personally only develop on Linux, but since I want my projects to be portable I need them to work on Windows too - thus I can't use hiredis for my projects at the moment).

BTW, this is the project where I'm using hiredis right now: https://github.com/mbitsnbites/buildcache (Redis support for Windows is disabled).

Closing via #652


Kafka-16355: Fix ConcurrentModificationException in evictWhile Method

This PR addresses an issue with the evictWhile method where a ConcurrentModificationException was being thrown due to modifications made to sortedMap during iteration. The following changes have been made:

Safe Iteration: The method now iterates over a copied list of entries from sortedMap, ensuring that modifications to sortedMap do not interfere with the iteration process.
Consistent Removal: Entries are safely removed from sortedMap during the iteration without causing a ConcurrentModificationException.

Committer Checklist (excluded from commit message)

[ ] Verify design and implementation
[ ] Verify test coverage and CI build status
[ ] Verify documentation (including upgrade notes)

Created an alternate PR to remove unnecessary duplicate commits


cant open local file , just the one in the example. probably only from web

i was able to open the example .
but couldnt load a local file . how can i do that ?

You can do it by get a epub file from a API, download and saving on the device, get the path and read using someting like RNFetchBlob, then convert to a base64, and use on the Book component, the final result on the provider is something like this:
<Book   dataBase64={yourDataBase64} />

I'm ok all through steps 1-3 using FyleSystem.readAsString to make base64 conversion instead of RNfetchBlob(should work the same), but when i assign the variable to reader src it still doesn't work :(

update: everything is working just fine :} I was having issues related to memory management that were unrelated to this library.
For anyone wondering:

Once you have your file locally you need to access this file using some file management lib (RNFetchBlob, expo File System etc - any of these should have the methods you need)
Then you need to read this file encoding it do base64 and storing this string to a variable (both libraries cited have the methods to do this). Here you need to be careful with memory management - I was storing this huge string on RAM and it was breaking everything.
Pass the string to Reader as src = {{ base64: variableContainingBase64String }}

update: everything is working just fine :} I was having issues related to memory management that were unrelated to this library. For anyone wondering:
1. Once you have your file locally you need to access this file using some file management lib (RNFetchBlob, expo File System etc - any of these should have the methods you need)

2. Then you need to read this file encoding it to base64 and storing this string into a variable (both libraries cited have the methods to do this). Here you need to be careful with memory management - I was storing this _huge_ string on RAM and it was breaking everything.

3. Pass the string to Reader as `src = {{ base64: variableContainingBase64String }}`

How did you get past the memory issue regarding a huge b64 string?

@anacchaves exactly.. the memory issue, is just because of the base64. But you can use something like a debounce (that is like a setTimeout execute this code later) of the lodash library, to delay the render of file, and not make that this epubjs lib miss to render your ebook.

update: everything is working just fine :} I was having issues related to memory management that were unrelated to this library. For anyone wondering:
1. Once you have your file locally you need to access this file using some file management lib (RNFetchBlob, expo File System etc - any of these should have the methods you need)

2. Then you need to read this file encoding it to base64 and storing this string into a variable (both libraries cited have the methods to do this). Here you need to be careful with memory management - I was storing this _huge_ string on RAM and it was breaking everything.

3. Pass the string to Reader as `src = {{ base64: variableContainingBase64String }}`

How did you get past the memory issue regarding a huge b64 string?

@csmattila delay to render the ebook, based the size of your file (creating your logic). You could use something with setTimeout, or debounce(loadsh), but basically, delay execution of rendering the component, to assign the base64 variable reference to the lib epub.

@fabiancarlos,

atualização: tudo está funcionando bem :} Eu estava tendo problemas relacionados ao gerenciamento de memória que não estavam relacionados a esta biblioteca. Para quem está se perguntando:
1. Once you have your file locally you need to access this file using some file management lib (RNFetchBlob, expo File System etc - any of these should have the methods you need)

2. Then you need to read this file encoding it to base64 and storing this string into a variable (both libraries cited have the methods to do this). Here you need to be careful with memory management - I was storing this _huge_ string on RAM and it was breaking everything.

3. Pass the string to Reader as `src = {{ base64: variableContainingBase64String }}`

Como você superou o problema de memória em relação a uma enorme string b64?

@csmattilaatraso para renderizar o ebook, baseado no tamanho do seu arquivo (criando sua lógica). Você poderia usar algo com setTimeout, ou debounce(loadsh), mas basicamente, atrasar a execução da renderização do componente, para atribuir a referência da variável base64 à lib epub.

Good afternoon my friend, do you have an example of how to create this delay in rendering?

i was able to open the example . but couldnt load a local file . how can i do that ?

Hi @eyalgromzin. How did you get the sample to open? Mine is just blank on both expo and RN app.
Probably I can see a sample or something.
Thanks

My problem is with the epub file. It does not recognize the file that is in the form of uri and with the .epub

hi everyone, i solving this issue in next version and added some examples in this repository, sorry for answering so late..


Blue Selection trigged when List (Blur) Selection expected

NavigationLink and List selection state seem to be overlapping.
There are two ways this happens:

select a post
see the post now has a grey selected background
tap section header
see the selected post now has a blue selected background
all consecutive selections will have a blue background as well

Click on the edge of the list item (outside the text or images)

Perhaps make the click area fill the space so that clicking on the edge won't cause a selection.

@carson-katri Is this the issue you described?
Seems like highlighting is stuck on first selection on the List I make and subsequent selections of topics aren't highlighted as seen.
Can you please suggest any starting point to look into this issue.

@Nikhil0487 I'd start in PostList.swift. There you'll see the code that handles the selection state for both NavigationLink and List. I believe the issue is that they both have selection states independent from one another, which is leading to issues with both.


Flaky coverage

We might possibly have a flaky test that's causing coverage to drop
https://coveralls.io/builds/14255546/source?filename=pkg%2Fhealthcheck%2Fhandler.go

Did a little digging:
Coverage passes:
=== RUN   TestServeHandler
2017-11-29T14:32:58.435Z	ERROR	_obj_test/handler.go:83	failed to serve	{"error": "accept tcp [::]:43979: use of closed network connection"}
github.com/jaegertracing/jaeger/pkg/healthcheck.ServeWithListener.func1
github.com/jaegertracing/jaeger/pkg/healthcheck/_test/_obj_test/handler.go:83
--- PASS: TestServeHandler (0.00s)
PASS
coverage: 100.0% of statements
Coverage fails:
=== RUN   TestServeHandler
--- PASS: TestServeHandler (0.00s)
PASS
coverage: 92.6% of statements
2017-11-29T10:32:30.052Z	ERROR	_obj_test/handler.go:83	failed to serve	{"error": "accept tcp [::]:46818: use of closed network connection"}
Looks like the function under test starts a go routine that might only be run after the coverage is run. I'll add a fix that waits until the routine starts.

I believe this is now outdated: https://codecov.io/gh/jaegertracing/jaeger/branch/master/history/pkg/healthcheck/handler.go?before=65a499a247e0e7d0f977f1898100e469975746ac


Compound Children Should not Be Drag & Droppable

Hello,
Currently the rule is that a compound could not be drag & dropped, however when I drag and drop a child of a compound onto another node, the parent of the dragged node disappears (see gif).

Expected Behavior:
Dragging the child element over another node should not trigger compounding.
Environment:
"cytoscape": "^3.20.0",
"cytoscape-compound-drag-and-drop": "^1.0.0",
"cytoscape-cose-bilkent": "^4.1.0",
"cytoscape-expand-collapse": "^4.1.0",
Best regards,
Alex

I have opened a PR that allows parent nodes to be real nodes:
#17


Implement StepSecurity Secure Workflows (policy)

Feature Request
Implement StepSecurity Secure Workflows Harden Runner recommendations.
Expected Behaviour
Workflows will be updated following the recommendations.
Additional Context
Actions not currently in the StepSecurity token permission database:

samspills/assign-pr-to-author

Linked To
#156 Implement StepSecurity Secure Workflows (audit)

CI Build

Step
Domain

Checkout (actions/checkout)
github.com:443

Setup .NET (actions/setup-dotnet)
dotnetbuilds.azureedge.net:443

Setup .NET (actions/setup-dotnet)
dotnetcli.azureedge.net:443

Setup .NET (actions/setup-dotnet)
dotnetcli.blob.core.windows.net:443

Restore Dependencies
api.nuget.org:443

Test EDlib
httpbin.org:443

Add PR Comment (marocchino/sticky-pull-request-comment)
api.github.com:443

Upload Artifact (actions/upload-artifact)
pipelines.actions.githubusercontent.com:443

EDlib Demo
api.taranissoftware.com:443

EDlib Demo
www.edsm.net:443

EDlib Demo
inara.cz:443

Post Complete (provisioner)
gheus23u20scusc21diag.blob.core.windows.net:443

The outbound call during the Post Complete (provisioner) step only happens on some runs and does not appear in the Recommended Policy.
- name: Harden Runner
  uses: step-security/harden-runner@74b568e8591fbb3115c70f3436a0c6b0909a8504
  with:
    egress-policy: block
    allowed-endpoints: >
      api.nuget.org:443
      api.taranissoftware.com:443
      dotnetbuilds.azureedge.net:443
      dotnetcli.azureedge.net:443
      dotnetcli.blob.core.windows.net:443
      github.com:443
      httpbin.org:443
      inara.cz:443
      pipelines.actions.githubusercontent.com:443
      www.edsm.net:443

CodeQL Scan

Step
Domain

Checkout (actions/checkout)
github.com:443

Initialize CodeQL (github/codeql-action/init)
api.github.com:443

Setup .NET (actions/setup-dotnet)
dotnetbuilds.azureedge.net:443

Setup .NET (actions/setup-dotnet)
dotnetcli.azureedge.net:443

Setup .NET (actions/setup-dotnet)
dotnetcli.blob.core.windows.net:443

Restore Dependencies
api.nuget.org:443

Restore Dependencies
dc.services.visualstudio.com:443

Build EDlib
api.nuget.org:443

Build EDlib
dc.services.visualstudio.com:443

Perform CodeQL Analysis (github/codeql-action/analyze)
api.github.com:443

Perform CodeQL Analysis (github/codeql-action/analyze)
uploads.github.com:443

Post Complete (Runner.Worker)
pipelines.actions.githubusercontent.com:443

Post Complete (provisioner)
gheus23u20scusc21diag.blob.core.windows.net:443

The outbound call during Post Complete job (provisioner) only happens on some runs on the Action and does neither Post Complete calls appears in the Recommended Policy.
- name: Harden Runner
  uses: step-security/harden-runner@74b568e8591fbb3115c70f3436a0c6b0909a8504
  with:
    egress-policy: block
    allowed-endpoints: >
      api.github.com:443
      api.nuget.org:443
      dc.services.visualstudio.com:443
      dotnetbuilds.azureedge.net:443
      dotnetcli.azureedge.net:443
      dotnetcli.blob.core.windows.net:443
      github.com:443
      uploads.github.com:443

Why do the Restore & Build steps call visualstudio.com in this workflow but not the CI workflow?
Why does the Build step call nuget.org when it doesn't in the CI workflow?

Assign to Project

Step
Domain

Assign Issues + PRs (srggrs/assign-one-project-github-action)
api.github.com:443

- name: Harden Runner
  uses: step-security/harden-runner@74b568e8591fbb3115c70f3436a0c6b0909a8504
  with:
    egress-policy: block
    allowed-endpoints: >
      api.github.com:443

Auto Assigner

Step
Domain

Assign PR (samspills/assign-pr-to-author)
api.github.com:443

- name: Harden Runner
  uses: step-security/harden-runner@74b568e8591fbb3115c70f3436a0c6b0909a8504
  with:
    egress-policy: block
    allowed-endpoints: >
      api.github.com:443

Mark Stale

Step
Domain

Stale(actions/stale)
api.github.com:443

- name: Harden Runner
  uses: step-security/harden-runner@74b568e8591fbb3115c70f3436a0c6b0909a8504
  with:
    egress-policy: block
    allowed-endpoints: >
      api.github.com:443

PR Labeller

Step
Domain

Stale(actions/labeler)
api.github.com:443

Post Complete (Runner.Worker)
pipelines.actions.githubusercontent.com:443

- name: Harden Runner
  uses: step-security/harden-runner@74b568e8591fbb3115c70f3436a0c6b0909a8504
  with:
    egress-policy: block
    allowed-endpoints: >
      api.github.com:443

Update Docs

Step
Domain

Checkout (actions/checkout)
github.com:443

Deploy to GitHub Pages (peaceiris/actions-gh-pages)
github.com:443

- name: Harden Runner
  uses: step-security/harden-runner@74b568e8591fbb3115c70f3436a0c6b0909a8504
  with:
    egress-policy: block
    allowed-endpoints: >
      github.com:443

Note: Only 1 example of running this workflow available.

Build & Deploy
There is no example of this workflow but maybe we can predict the calls made using other build workflows.

Step
Domain

Checkout (actions/checkout)
github.com:443

Setup .NET (actions/setup-dotnet)
dotnetbuilds.azureedge.net:443

Setup .NET (actions/setup-dotnet)
dotnetcli.azureedge.net:443

Setup .NET (actions/setup-dotnet)
dotnetcli.blob.core.windows.net:443

Restore Dependencies
api.nuget.org:443

Test EDlib
httpbin.org:443

Upload Artifact (actions/upload-artifact)
pipelines.actions.githubusercontent.com:443

Download Artifacts (actions/download-artifact)
pipelines.actions.githubusercontent.com:443❓

Push to GitHub Packages
❓

Add Report to Release (irongut/EditRelease?
api.github.com:443❓

Deploy to GitHub Pages (peaceiris/actions-gh-pages)
github.com:443

- name: Harden Runner
  uses: step-security/harden-runner@74b568e8591fbb3115c70f3436a0c6b0909a8504
  with:
    egress-policy: block
    allowed-endpoints: >
      api.nuget.org:443
      api.taranissoftware.com:443
      dotnetbuilds.azureedge.net:443
      dotnetcli.azureedge.net:443
      dotnetcli.blob.core.windows.net:443
      github.com:443
      httpbin.org:443
      inara.cz:443
      pipelines.actions.githubusercontent.com:443
      www.edsm.net:443


uvRespectAnchor for CanvasRenderer

#3645
It turns out, people are using that mode, so we need implementation for Canvas2d.
I tested it in pixi-examples window, its safe to merge.

@ivanpopelyshev It's required there be two approvals before merging. Please don't merge prematurely.

@bigtimebuddy Oh, right, I counted mine approval by mistake :)


Zerofox/update alerts version

Required items, please complete
Change(s):

Version tag in alert data connector

Reason for Change(s):

In the last fix we didn't update the version, so its hard to know if the customers are running the latest version

Testing Completed:

Yes

Checked that the validations are passing and have addressed any issues that are present:

Yes

@microsoft-github-policy-service agree [company="ZeroFox"]

@microsoft-github-policy-service agree company="ZeroFox"


feat: added width of column to TablePersoController save

In a project I am using a sap.m.Table together with a sap.m.TablePersoController and the SmartVariantManagement.
Unfortunately the TablePersoController does not  save the width of a column.
Since I added the ColumnResizer as well, it would be beneficial for the users to store the set width of a column as well.
Therefore I added the width of a column to the personalization save but it is only saved, if this is set explicitly to ensure compability.

Hello, is there any update possible?

Hello @Fjaoos,
first of all thanks for your contribution.
As you might have noticed we have deprecated the TablePersoControllers with UI5 version 1.115. Therefore there will be not further enhancements in these modules.
The reason is that already for a long time we do not use them in most of our own UIs. Instead another approach was implemented and is used there.
This personalization functionality was recently encapsulated in an own module and made available for standalone scenarios:
https://openui5nightly.hana.ondemand.com/topic/75c08fdebf784575947927e052712bab
In future this direction will also be extended and refined. The scenarios which were covered by the TablePersoControllers are already available incl. the column width handling: Column Visibility, Column Width, Sorting and Grouping for sap.m.Table
Here are 2 examples which we just finished some days ago and which show how the same personalization scenario could be handled with both table types:
https://openui5nightly.hana.ondemand.com/entity/sap.ui.table.Table/sample/sap.m.sample.p13n.EngineGridTable
https://openui5nightly.hana.ondemand.com/entity/sap.m.Table/sample/sap.m.sample.p13n.Engine
Best Regards
Jens


Can't run storybook in docker

Hi there,
I am not able to run storybook in docker. Everytime I run docker-compose up I can see the port bumped by one, even though I am passing the port as a CLI option.
from my docker-compose.yml:
  storybook:
    container_name: storybook
    command: npm run docker:storybook
    image: node:10.15.1
    volumes:
      - ./frontend:/usr/src/app
    working_dir: /usr/src/app
    ports:
      - 65200

in my package.json:
"docker:storybook": "start-storybook -p 65200 --ci"

on docker-compose up storybook boots up just fine and also shows the message:
storybook    |
storybook    | ><EMAIL_ADDRESS>docker:storybook /usr/src/app
storybook    | > npm run storybook -- --ci
storybook    |
storybook    |
storybook    | ><EMAIL_ADDRESS>storybook /usr/src/app
storybook    | > start-storybook -p 65200 "--ci"
storybook    |
storybook    | info @storybook/vue v5.1.0-alpha.25
storybook    | info
storybook    | info => Loading presets
storybook    | info => Loading presets
storybook    | info => Loading custom webpack config (full-control mode).
storybook   webpack built 75bb1c408bb823148bbb in 16658ms                                                                     c storybook    | ╭─────────────────────────────────────────────────╮
storybook    | │                                                 │
storybook    | │   Storybook 5.1.0-alpha.25 started              │
storybook    | │   22 s for manager and 21 s for preview         │
storybook    | │                                                 │
storybook    | │   Local:            http://localhost:65200/     │
storybook    | │   On your network:  http://<IP_ADDRESS>:65200/    │
storybook    | │                                                 │
storybook    | ╰─────────────────────────────────────────────────╯

Although when I open those URLs in my browser it results in This site can’t be reached.
Running docker-ps shows me that the port is not the same that I configured.
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
81dee00e03cd        node:10.15.1        "npm run docker:stor…"   16 minutes ago      Up 3 minutes        <IP_ADDRESS>:32779->65200/tcp   storybook

When I stop and start docker-compose again, the port is incremented by one:
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
81dee00e03cd        node:10.15.1        "npm run docker:stor…"   18 minutes ago      Up About a minute   <IP_ADDRESS>:32780->65200/tcp   storybook

How can I make sure the port is always the same? Is there another way to access storybook via docker?

I there, was my fault!
it must be
ports:
      - "65200:65200"

instead of
ports:
      - 65200