Excessive memory usage in Rubocop JUnit Reporter starting in 1.46.0 or 1.47.0

Expected behavior
Version 1.46.0 and Version 1.47.0 have same memory footprint as 1.45.1 and below and are relatively drop-in.
Actual behavior
When running with any of 1.45.1, 1.46.0 or 1.47.0 vs our source code base, we are fine when we run this and it takes a minute or so. Max memory is 200MB or so.
bundle exec rubocop --fail-level W --display-only-fail-level-offenses

Similar on 1.45.1 when running in unit mode - Max memory is 200MB or so.
But memory goes into the gigabytes when we run this on 1.46.0 or 1.47.0 and it takes 30+ minutes if it even finishes:
bundle exec rubocop --format junit --fail-level W --display-only-failed --display-only-fail-level-offenses --out results/rubocop.xml

For example, I kicked these off at the same time, as they are mid-running:
The top row is Rubocop 1.47.0, and bottom one is Rubocop 1.45.1, both running the junit version of the command . Same code repository, just git-cloned into two different folders
You can see the massive difference

Steps to reproduce the problem
This is a private source code base, so I can't share out unfortunately.
Never had an issue on rubocop upgrades before,
Upgrade to a rubocop 1.46.0 or 1.47.0 and run this command:
bundle exec rubocop --format junit --fail-level W --display-only-failed --display-only-fail-level-offenses --out results/rubocop.xml

Note: I also tried upgrading rubocop-rails along with rubocop, same issue, so it's not that.
RuboCop version
1.45.1 (using Parser <IP_ADDRESS>, rubocop-ast 1.27.0, running on ruby 2.7.7) [arm64-darwin21]
  - rubocop-minitest 0.28.0
  - rubocop-performance 1.16.0
  - rubocop-rails 2.17.4
  - rubocop-rake 0.6.0

1.47.0 (using Parser <IP_ADDRESS>, rubocop-ast 1.27.0, running on ruby 2.7.7) [arm64-darwin21]
  - rubocop-minitest 0.28.0
  - rubocop-performance 1.16.0
  - rubocop-rails 2.17.4
  - rubocop-rake 0.6.0

Can you identify where the problem is (by using the recently introduced profiling ability - https://github.com/rubocop/rubocop/pull/11396)?
If you try to measure memory (additionally to cpu, --memory option), it will probably blow up because of how large it is. So you can try on a subset of the project.
If that won't help, you can try to disable extensions (rubocop-minitest etc) one by one and see if the problem disappears.
If it is not, the problem is likely in the rubocop itself and you can try to run git bisect on commits between 1.45.1 and 1.46 and try to find the problematic commit.

@fatkodima, thanks for suggestion on git bisect
I can narrow it down to  https://github.com/rubocop/rubocop/pull/11603 / https://github.com/rubocop/rubocop/commit/efce268820e4dbbb4a85a61d3510ab351d4d0c4f
Our memory doesn't go above 250MB during a complete run in all previous commits, but spirals into the GB once that commit is applied. Including @tdeo as the commit author in case any ideas arise for additional debugging I can help provide for the junit scenario.
To confirm, https://github.com/rubocop/rubocop/commit/52e8e4f11f358db25f3b7dd2bec8f2a1252c548c is the previous commit, and this does not show this behavior.

Note I did this against the following just to confirm as well against a more stock rubocop install:

removed all extensions (both from the Gemfile, the Gemfile.lock, and the rubocop.yml and rubocop_todo.yml)
removed all of our custom cops  (both from the Gemfile, the Gemfile.lock, and the rubocop.yml and rubocop_todo.yml)

Same issue re: memory usage when using the junit formatter after https://github.com/rubocop/rubocop/pull/11603 / https://github.com/rubocop/rubocop/commit/efce268820e4dbbb4a85a61d3510ab351d4d0c4f , so we can rule extensions or custom cops as causes

I can't reproduce that locally. I see that junit format generation already generates a gazillion of memory, before and after that PR. So I would try to optimize that separately.
Is this happening only with junit format in your case? And can you run rubocop --profile --memory ... and try to get the memory report file and paste it here (or give a link for the file), so we can see the exact offending locations?

Would you happen to have a significant amount of inline enable / disable directives? Otherwise did you have very few enabled cops in the first place?

@tdeo not sure how to compare vs other projects, but I'd say yeah, we have a good amount listed in our rubocop.yml and rubocop_todo.yml
@fatkodima I'll try getting a profile up to see, but will need to make sure it's redacted enough not to give away any private info.
In our case, I have only tried the normal outputted + Junit outputter, but only see this issue with Junit, it's far higher than normal (by a ton) so breaking our CI system which has a memory limit on any given.

@fatkodima , actually I just tried json formatter, so it's not just junit.
bundle exec rubocop --format json --fail-level W --display-only-fail-level-offenses

Same issue: memory goes super high with https://github.com/rubocop/rubocop/commit/efce268820e4dbbb4a85a61d3510ab351d4d0c4f , but doesn't with any commit before.

Yeah, it doesn't seem to be an issue limited to JUnit formatter if https://github.com/rubocop/rubocop/pull/11603 is the cause.

I think I see the issue - using Rubocop 1.46.0 (or any commit after #11603 ) - the cache is not used at all, every file is scanned.
without a formatter in debug mode: (i.e. bundle exec rubocop --fail-level W --display-only-fail-level-offenses -d)
For /Users/REDACTED/REDACTED/app: configuration from /Users/REDACTED/REDACTED/app/.rubocop.yml
Inheriting configuration from /Users/REDACTED/REDACTED/app/.rubocop_todo.yml
Default configuration from /Users/REDACTED/REDACTED/rubocop/config/default.yml
Inheriting configuration from /Users/REDACTED/REDACTED/app/.rubocop_doc_todo.yml
.rubocop.yml: Lint/UnderscorePrefixedVariableName:Enabled overrides the same parameter in .rubocop_todo.yml
.rubocop.yml: Naming/AccessorMethodName:Enabled overrides the same parameter in .rubocop_todo.yml
.rubocop.yml: Naming/MethodParameterName:Enabled overrides the same parameter in .rubocop_todo.yml
.rubocop.yml: Naming/PredicateName:Enabled overrides the same parameter in .rubocop_todo.yml
Use parallel by default.
Running parallel inspection
Loading cache from .rubocop-cache/rubocop_cache/REDACTED/REDACTED/REDACTED_FILE
Loading cache from .rubocop-cache/rubocop_cache/REDACTED/REDACTED/REDACTED_FILE

and so on...

With a formatter:  (i.e. bundle exec rubocop --fail-level W --display-only-fail-level-offenses -d --format json or bundle exec rubocop --fail-level W --display-only-fail-level-offenses -d --format junit)
For /Users/REDACTED/REDACTED/app: configuration from /Users/REDACTED/REDACTED/app/.rubocop.yml
Inheriting configuration from /Users/REDACTED/REDACTED/app/.rubocop_todo.yml
Default configuration from /Users/REDACTED/rubocop/config/default.yml
Inheriting configuration from /Users/REDACTED/REDACTED/app/.rubocop_doc_todo.yml
.rubocop.yml: Lint/UnderscorePrefixedVariableName:Enabled overrides the same parameter in .rubocop_todo.yml
.rubocop.yml: Naming/AccessorMethodName:Enabled overrides the same parameter in .rubocop_todo.yml
.rubocop.yml: Naming/MethodParameterName:Enabled overrides the same parameter in .rubocop_todo.yml
.rubocop.yml: Naming/PredicateName:Enabled overrides the same parameter in .rubocop_todo.yml
Scanning /Users/REDACTED/REDACTED/app/Gemfile
Scanning /Users/REDACTED/REDACTED/app/Rakefile
Scanning /Users/REDACTED/REDACTED/REDACTED_PATH/REDACTED_FILE.rb
Scanning /Users/REDACTED/REDACTED/REDACTED_PATH/REDACTED_FILE.rb

and so on...

actually, that may not be it in full. Even with 1.45.1, cache is not looked at with formatters (but is without formatters) per the logs.
The memory goes up, however, in 1.46.0 with a formatter while the logs are still showing Scanning which doesn't happen during 1.45.1.

if I run bundle exec rubocop --fail-level W --display-only-fail-level-offenses -d --cache false I see same behavior of memory gain to GB in 1.46.0 as I do with formatters enabled. So i think that might be related for sure, if not the actual issue.

<sorry for noise, changing which Github account I was using>
I think I see the issue - using Rubocop 1.46.0 (or any commit after https://github.com/rubocop/rubocop/pull/11603 ) - the cache is not used at also appears to be ignored? Parallelization also appears to be ignored?
without a formatter in debug mode: (i.e. bundle exec rubocop --fail-level W --display-only-fail-level-offenses -d)
For /Users/REDACTED/REDACTED/app: configuration from /Users/REDACTED/REDACTED/app/.rubocop.yml
Inheriting configuration from /Users/REDACTED/REDACTED/app/.rubocop_todo.yml
Default configuration from /Users/REDACTED/REDACTED/rubocop/config/default.yml
Inheriting configuration from /Users/REDACTED/REDACTED/app/.rubocop_doc_todo.yml
.rubocop.yml: Lint/UnderscorePrefixedVariableName:Enabled overrides the same parameter in .rubocop_todo.yml
.rubocop.yml: Naming/AccessorMethodName:Enabled overrides the same parameter in .rubocop_todo.yml
.rubocop.yml: Naming/MethodParameterName:Enabled overrides the same parameter in .rubocop_todo.yml
.rubocop.yml: Naming/PredicateName:Enabled overrides the same parameter in .rubocop_todo.yml
Use parallel by default.
Running parallel inspection
Loading cache from .rubocop-cache/rubocop_cache/REDACTED/REDACTED/REDACTED_FILE
Loading cache from .rubocop-cache/rubocop_cache/REDACTED/REDACTED/REDACTED_FILE
and so on...
With a formatter: (i.e. bundle exec rubocop --fail-level W --display-only-fail-level-offenses -d --format json or bundle exec rubocop --fail-level W --display-only-fail-level-offenses -d --format junit)
For /Users/REDACTED/REDACTED/app: configuration from /Users/REDACTED/REDACTED/app/.rubocop.yml
Inheriting configuration from /Users/REDACTED/REDACTED/app/.rubocop_todo.yml
Default configuration from /Users/REDACTED/rubocop/config/default.yml
Inheriting configuration from /Users/REDACTED/REDACTED/app/.rubocop_doc_todo.yml
.rubocop.yml: Lint/UnderscorePrefixedVariableName:Enabled overrides the same parameter in .rubocop_todo.yml
.rubocop.yml: Naming/AccessorMethodName:Enabled overrides the same parameter in .rubocop_todo.yml
.rubocop.yml: Naming/MethodParameterName:Enabled overrides the same parameter in .rubocop_todo.yml
.rubocop.yml: Naming/PredicateName:Enabled overrides the same parameter in .rubocop_todo.yml
Scanning /Users/REDACTED/REDACTED/app/Gemfile
Scanning /Users/REDACTED/REDACTED/app/Rakefile
Scanning /Users/REDACTED/REDACTED/REDACTED_PATH/REDACTED_FILE.rb
Scanning /Users/REDACTED/REDACTED/REDACTED_PATH/REDACTED_FILE.rb
and so on...

actually, that may not be it in full. Even with 1.45.1, cache is not looked at with formatters (but is without formatters) per the logs.
The memory goes up, however, in 1.46.0 with a formatter while the logs are still showing Scanning which doesn't happen during 1.45.1.

if I run bundle exec rubocop --fail-level W --display-only-fail-level-offenses -d --cache false I see same behavior of memory gain to GB in 1.46.0 as I do with formatters enabled. So i think that might be related for sure, if not the actual issue.

Also @fatkodima ,I tried doing a memory profile, but it's not giving accurate results. Using --memory --profile is also disabling cache.
This uses cache per logs in v1.46.0:
bundle exec rubocop --fail-level W --display-only-fail-level-offenses app/ops -d --cache true

This does not:
bundle exec rubocop --fail-level W --display-only-fail-level-offenses app/ops -d --cache true --memory --profile

Can you run a memory profile on a larger set of files? To have at least 500Mb of allocated memory. I do not think rubocop/lib/rubocop/config.rb:37 would still stay at the top.

Can you check if https://github.com/rubocop/rubocop/pull/11665 fixes your problem?

I broke the profile/formatter stopping cache and parallelization running issue out to it's own ticket: https://github.com/rubocop/rubocop/issues/11664
So here we can focus on the memory usage. As you can see, even at >750 MB, config.rb:37 stays on top after https://github.com/rubocop/rubocop/commit/efce268820e4dbbb4a85a61d3510ab351d4d0c4f
bundle install;bundle exec rubocop --fail-level W --display-only-fail-level-offenses app/REDACTED/REDACTED --format json -d --memory --profile
Total allocated: 757.24 MB (9940107 objects)
Total retained:  286.29 MB (2177358 objects)

allocated memory by gem
-----------------------------------
 489.53 MB  rubocop/lib
 120.28 MB  rubocop-ast-1.27.0
  98.80 MB  parser-<IP_ADDRESS>
  22.75 MB  other
   6.13 MB  erb
   5.93 MB  psych
   4.70 MB  ast-2.4.2
   3.73 MB  set
   1.61 MB  pathname
   1.51 MB  unicode-display_width-2.4.2
   1.13 MB  rubygems
 568.48 kB  did_you_mean
 257.69 kB  forwardable
 249.76 kB  regexp_parser-2.7.0
  66.50 kB  uri
   1.44 kB  fileutils

and
allocated memory by location
-----------------------------------
 121.95 MB  /Users/REDACTED/REDACTED/rubocop/lib/rubocop/config.rb:37
  64.89 MB  /Users/REDACTED/REDACTED/rubocop/lib/rubocop/cop/team.rb:32
  33.56 MB  /Users/REDACTED/REDACTED/rubocop/lib/rubocop/config.rb:34
  32.14 MB  /Users/REDACTED/REDACTED/rubocop/lib/rubocop/cop/base.rb:346
  30.19 MB  /Users/REDACTED/REDACTED/rubocop/lib/rubocop/config.rb:319
  27.85 MB  /Users/REDACTED/.rbenv/versions/2.7.7/lib/ruby/gems/2.7.0/gems/parser-<IP_ADDRESS>/lib/parser/source/buffer.rb:205
  15.95 MB  /Users/REDACTED/.rbenv/versions/2.7.7/lib/ruby/gems/2.7.0/gems/rubocop-ast-1.27.0/lib/rubocop/ast/builder.rb:99
  15.75 MB  /Users/REDACTED/REDACTED/rubocop/lib/rubocop/cop/commissioner.rb:125
  15.69 MB  /Users/REDACTED/.rbenv/versions/2.7.7/lib/ruby/gems/2.7.0/gems/rubocop-ast-1.27.0/lib/rubocop/ast/node.rb:93
  12.55 MB  /Users/REDACTED/.rbenv/versions/2.7.7/lib/ruby/gems/2.7.0/gems/rubocop-ast-1.27.0/lib/rubocop/ast/node.rb:236
  11.64 MB  /Users/REDACTED/.rbenv/versions/2.7.7/lib/ruby/gems/2.7.0/gems/parser-<IP_ADDRESS>/lib/parser/lexer-F1.rb:14606
  11.16 MB  <internal:pack>:258
  10.96 MB  (eval):3
   8.84 MB  /Users/REDACTED/REDACTED/rubocop/lib/rubocop/cop/commissioner.rb:150
   8.76 MB  /Users/REDACTED/REDACTED/rubocop/lib/rubocop/cop/commissioner.rb:153

Can you check if #11665 fixes your problem?

@fatkodima that definitely impacted things (for the better!). Huge difference, both when running overall and for the specific memory profile case I was using. thanks for looking so quickly!
For the specific comparison, for the memory profile for the same folders mentioned here:
https://github.com/rubocop/rubocop/issues/11657#issuecomment-1455196429
is now:
(i.e. /Users/REDACTED/REDACTED/rubocop/lib/rubocop/config.rb:37 is now gone from list)
Total allocated: 560.66 MB (7818208 objects)
Total retained:  11.28 MB (76354 objects)

allocated memory by gem
-----------------------------------
 292.91 MB  rubocop/lib
 120.31 MB  rubocop-ast-1.27.0
  98.80 MB  parser-<IP_ADDRESS>
  22.75 MB  other
   6.13 MB  erb
   5.93 MB  psych
   4.70 MB  ast-2.4.2
   3.73 MB  set
   1.61 MB  pathname
   1.51 MB  unicode-display_width-2.4.2
   1.13 MB  rubygems
 569.70 kB  did_you_mean
 257.88 kB  forwardable
 249.76 kB  regexp_parser-2.7.0
  66.50 kB  uri
   1.44 kB  fileutils

allocated memory by location
-----------------------------------
  65.07 MB  /Users/REDACTED/REDACTED/rubocop/lib/rubocop/cop/team.rb:32
  32.22 MB  /Users/REDACTED/REDACTED/rubocop/lib/rubocop/cop/base.rb:346
  27.85 MB  /Users/REDACTED/.rbenv/versions/2.7.7/lib/ruby/gems/2.7.0/gems/parser-<IP_ADDRESS>/lib/parser/source/buffer.rb:205
  15.95 MB  /Users/REDACTED/.rbenv/versions/2.7.7/lib/ruby/gems/2.7.0/gems/rubocop-ast-1.27.0/lib/rubocop/ast/builder.rb:99
  15.79 MB  /Users/REDACTED/REDACTED/rubocop/lib/rubocop/cop/commissioner.rb:125
  15.69 MB  /Users/REDACTED/.rbenv/versions/2.7.7/lib/ruby/gems/2.7.0/gems/rubocop-ast-1.27.0/lib/rubocop/ast/node.rb:93
  12.55 MB  /Users/REDACTED/.rbenv/versions/2.7.7/lib/ruby/gems/2.7.0/gems/rubocop-ast-1.27.0/lib/rubocop/ast/node.rb:236
  11.64 MB  /Users/REDACTED/.rbenv/versions/2.7.7/lib/ruby/gems/2.7.0/gems/parser-<IP_ADDRESS>/lib/parser/lexer-F1.rb:14606
  11.16 MB  <internal:pack>:258
  10.96 MB  (eval):3
   8.84 MB  /Users/REDACTED/guideline/rubocop/lib/rubocop/cop/commissioner.rb:150
   8.76 MB  /Users/REDACTED/guideline/rubocop/lib/rubocop/cop/commissioner.rb:153

@fatkodima With that change, a full run over our source code isn't going above 125 MB runtime memory (while not running profiling). Prior to this, it was at 25 GB or so last time before I killed it.


make default display not be a spinner, but something that shows progress

It would be nice to have several options for the k2cli output, especially on something like up and down.  Perhaps the default could be something like to show completed steps:
Status

etcd nodes built
etcd cluster established
control plane nodes built
API Service established (in progress)
API ELB functional
Network Fabric established
KubeDNS deployed
Tiller Deployed
Services Deployed
9a) Kubernetes Dashboard
9b) fluentd

There could also be a super pithy option of a terminal spinner like we have now, and then the options of verbose output.
These articles offer some insight as to why our current setup of a spinner may not create the best user experience :

https://uxplanet.org/progress-indicators-in-mobile-ux-design-a141e22f3ea0
http://uxmovement.com/navigation/progress-bars-vs-spinners-when-to-use-which/

Usually these types of things require some hooks to be added to the running code. For now all we have is output from stdout which we can show via verbosity. There is another ticket to make this verbose by default and silent as the optional thing. Which may take care of this issue or not. I am not sure how to hook the output into something kraken can pick up, but ill investigate.

This was fixed here: https://github.com/samsung-cnct/kraken/pull/181

Actually, this ticket is asking for something more than changing the spinner. Instead we would like more informational message regarding what the kraken command is doing at each step.


Backspace deletes doublequote

If autoclose is set to on, pressing backspace deletes the character before the cursor and leaves the character in the cursor UNLESS the character in the cursor is a double quote in which case micro deletes both the character before the cursor and the double quote in the cursor.
Pressing backspace should only delete the character before the cursor even if the character in the cursor is a double quote.

I don't think I'm experiencing this issue.
If I have the cursor like so:

And I press the backspace button, I get:

I did fix the bug you are describing in commit ddcebe49467fdbca5ae8351c15eabbcdec96b9ee so make sure your version is updated (micro -version).
Let me know if I misunderstood the bug.

Ah, I built from source a while ago so I think I missed the fix. I rebuilt micro and the issue went away. Thank you!


Fix for Issue #3

The 8 hour blocks just ensures that it stays under 50000 trades. The usdt_btc pair has a few days this year that have over 100000 trades each, which conflicts with the original code.

Hi Florian, not sure if you saw I pushed a final version of this fix with your suggestion implemented.

@immac636 thanks for pinging me again and your PR :-) I like it, would you be interested in becoming a collaborator in this project?

Sure, I'm likely to keep using this and tinkering with it. I can maintain it if you like.

@immackay , cool! Welcome on board! Feel free to commit improvements and ping me if you want to have something released on PyPI.


explore — child profiles without images should inherit parent profile image

Doable?

We changed the url every time and this is good for SEO, we have to dig a little bit and see if we can prevent this but I do not think so.
A weird thing is the "0 of 1 dataset" message.


Adding support for static linking

Adding rule in the make file to create static library (.a)
Adding short text in the doc folder on how to link with the static (as well as the dynamic) library.

@vidstige we have added a CLA on the dev branch. Take a look at CONTRIBUTING.md for the full details. Once you have completed the instructions, we will accept this contribution when we merge dev back into master.

I agree to the terms of the librealsense CLA.


Utility functions: handle nulls and Strings gracefully

In order to ease the usage of the standard function we should handle nulls in a way that prevents NPE.
For instance:
uppercase(null)-> null
lowercase(null) -> null
contains(?, null) -> false
contains(null,?) -> false
trim(null) -> null

Also all those functions should take "Object" as parameter and cast it to String (by calling toString)
an alternative is to return the empty String, but users can use "coalesce" (or whenNull as noted below)
we should also provide something to safely concatenate fields
trim(Object) -> usual String.trim() method
concat(Object a, Object b) -> concatenates 2 strings, and null is considered a "empty" String

Thinking more to coalesce, it is a SQL term, I have always used it, but maybe we can name it like "whenNull" or something like that
whenNotNull(field/expression, value)
whenNull(field, defaultValue)

fullname = fn:contact(value.firstname, whenNotNull(field.surname, fn:contact(" ", field.surname))

Also all those functions should take "Object" as parameter and cast it to String (by calling toString)

I'm not sure about the toString part. It makes sense for functions like printing or logging, but what is the use case of a user passing a non-string object and wanting to uppercase it?

I think coalesce  is more clearer to the use about expectation (SQL is familiar, but also the operation itself is not SQL specific, check C#'s coalescing assignment).
Also whenNotNull(field/expression, value) is not clear about what is the behavior if null (does it return null or field/expression). Similarity, whenNull(field, defaultValue)  is not explicit about about what happens if not null..
Btw the ternary operator is supported, so user can always say smth like value == null ? 'x' : 'y or value or whatever'

On the second though, String.valueOf does actually what you are proposing about .toString. It seems it will minimize any chance of errors rather than the actual evaluation is useful so we minimize errors at evaluation time, I included it in the PR


Snowflake "Unknown function ENCODE" when casting to STRING

Issue 1:
When running comparisong from Snowflake to BigQuery with the following configuration file:
result_handler: {}
source: sf_conn
target: bq_conn
validations:
- calculated_fields: []
  comparison_fields:
  - cast: string
    field_alias: dv_id
    source_column: DV_ID
    target_column: dv_id
  filter_status: null
  filters: []
  format: table
  labels: []
  primary_keys:
  - cast: null
    field_alias: key_field
    source_column: KEY_FIELD
    target_column: key_field
  random_row_batch_size: '100'
  schema_name: dv
  table_name: TABLE1
  target_schema_name: dv
  target_table_name: TABLE1
  threshold: 0.0
  type: Row
  use_random_rows: true

With casting dv_id as string:
`  comparison_fields:

cast: string
field_alias: dv_id
source_column: DV_ID
target_column: dv_id`

It will result in error:
Unknown function ENCODE
And the resulted SQL will be the following:
SELECT encode(t1."DV_ID", %(encode_1)s)
Correct format should be:
SELECT hex_encode(t1."DV_ID", %(encode_1)s)
Resulting in pure SQL:
SELECT hex_encode(t1."DV_ID", 0)
Now the pure SQL result is incorrectly this:
SELECT encode(t1."DV_ID", 'escape')
Issue 2
Without casting it does work ok:
  comparison_fields:
  - cast: null
    field_alias: dv_id
    source_column: DV_ID
    target_column: dv_id

But if there is result_handler specified, it will fail in another error:
PM-ERROR: Error Object of type bytes is not JSON serializable occurred while running config file test.yaml. Skipping it for now.
Issue 3
Another one when comparing fields with Snowflake BINARY datatype and BigQuery BYTES. Queries go just fine to databases, but when writing results to result_handler, it will fail in error.
Configuration file:
result_handler:
  project_id: project_id
  table_id: table_id
  type: BigQuery
source: sf_conn
target: bq_conn
validations:
- calculated_fields: []
  comparison_fields:
  - cast: null
    field_alias: comp_field_1
    source_column: COMP_FIELD_1
    target_column: comp_field_1
  - cast: null
    field_alias: comp_field_1
    source_column: COMP_FIELD_1
    target_column: comp_field_1
  filter_status: null
  filters: []
  format: table
  labels: []
  primary_keys:
  - cast: null
    field_alias: dv_id
    source_column: DV_ID
    target_column: dv_id
  random_row_batch_size: '100'
  schema_name: dv
  table_name: TABLE1
  target_schema_name: dv
  target_table_name: TABLE1
  threshold: 0.0
  type: Row
  use_random_rows: true

Resulting error:
12/12/2023 02:29:12 PM-ERROR: Error cannot use a string pattern on a bytes-like object occurred while running config file test2.yaml. Skipping it for now.

Hi @henrihem! I'll start to investigate your issue, something that would be really helpful: could you please share the DDL statements for the Snowflake and BQ tables? With that I can better simulate your scenario, thanks!

Hi @helensilva14 , sorry for late response.
Here is the DDL for the tables:
Snowflake:
create or replace table TABLE1 ( 	DV_ID BINARY(16), 	KEY_FIELD VARCHAR(128) );
BigQuery
CREATE TABLE dv.TABLE1 (      dv_id BYTES(16),   	 KEY_FIELD STRING(128) );

Also if I run this one:
data-validation validate row \   -sc bq_conn \   -tc sf_conn \   -tbls dv.TABLE1=dv.TABLE1 \   --concat key_field \   --primary-keys dv_id \   -rr \   -rbs 100
It fails in:
TypeError: cannot use a string pattern on a bytes-like object

Henri,
I have been able to reproduce your problem(s). Can you outline exactly what you are trying to achieve ?
I have been able to successfully perform a validate row -comp-fields DV_ID -pk KEY_FIELD -rr -rbs 10 with your table schema between Snowflake and BigQuery (with KEY_FIELD as primary key). I am not able to store that vaildation result in BigQuery due to the TypeError: Object of type bytes is not JSON serializable - looks like we are trying to serialize the DV_ID field - so need to check how to fix this issue.
Our objective is not to fix DVT issues. Our objective is to get customers successful in their efforts to use DVT to validate two tables. The BigQuery issue is likely a bug - if fixed will help you. The other challenges you report (string in the yaml file causing ENCODE etc), I don't understand how they are related to the problem you are trying to solve - because I don't know exactly what your use case is.
If you can share that it will be helpful for us to prioritize and find fixes for you.
Thanks.
Sundar Mudupalli

Hi everyone! I opened a draft PR https://github.com/GoogleCloudPlatform/professional-services-data-validator/pull/1113 with our initial approach to solve this issue and that's the situation I'm at:
Case 1
I couldn't find yet which method can produce the desired output. Only the ENCODE functions worked so far but values are not matching though.

BASE64_ENCODE

HEX_ENCODE

Invalid argument types for function 'BASE64_DECODE_BINARY': (BINARY(16))

Invalid argument types for function 'BASE64_DECODE_STRING': (BINARY(16))

Invalid argument types for function 'HEX_DECODE_STRING': (BINARY(16))

Invalid argument types for function 'HEX_DECODE_BINARY': (BINARY(16))

Snowflake reference: https://docs.snowflake.com/sql-reference/functions/base64_decode_binary
Case 2
It works now both with or without the BQ result handler and getting successful validations
YAML used
result_handler:
  project_id: PROJECT_ID
  table_id: pso_data_validator.results
  type: BigQuery
source: snowflake
target: bq
validations:
- calculated_fields: []
  comparison_fields:
  - cast: null
    field_alias: dv_id
    source_column: DV_ID
    target_column: DV_ID # dv_id on issue
  filter_status: null
  filters: []
  format: table
  labels: []
  primary_keys:
  - cast: null
    field_alias: key_field
    source_column: KEY_FIELD
    target_column: KEY_FIELD # key_field on issue
  random_row_batch_size: '100'
  schema_name: PSO_DATA_VALIDATOR.PUBLIC
  table_name: ISSUE1070
  target_schema_name: pso_data_validator
  target_table_name: issue1070
  threshold: 0.0
  type: Row
  use_random_rows: true

Case 3
Still getting the error Error cannot use a string pattern on a bytes-like object

Also if I run this one:
data-validation validate row \
  -sc bq_conn \
  -tc sf_conn \
  -tbls dv.TABLE1=dv.TABLE1 \
  --concat key_field \
  --primary-keys dv_id \
  -rr \
  -rbs 100

It fails in: TypeError: cannot use a string pattern on a bytes-like object

Still getting this error as well in my current branch

Henri,
After further review, DVT is not handling binary data correctly - thank you for pointing this issue to us. There is a fairly straightforward workaround for this - use custom query validation. The DVT command to do the equivalent random row validation is
data-validation validate custom-query row -hash DV_ID -pk KEY_FIELD -rr -rbs 10 -sc snowflake -tc bq -sq 'select HEX_ENCODE(DV_ID) as DV_ID, KEY_FIELD from PSO_DATA_VALIDATOR.PUBLIC.ISSUE1070;'
-tq 'select TO_HEX(DV_ID) as DV_ID, KEY_FIELD from pso_data_validator.issue1070;'

This will also work with BQ report handler.
Can you let us know if this addresses your issue(s) ?
Thanks.
Sundar Mudupalli

Hi,
I'm well aware of the workaround to use custom query validations and that is what we've been using for simple cases.
However, it would be unfortunate not to be able to use query generation by DVT, as that would be really useful for our situation. Therefore I would still request DVT would support BINARY-keys.
I think currently DVT is trying to CAST the BINARY in Snowflake, but the casting is incorrect. I think this is a bug that needs to be fixed and the solution is to use HEX_ENCODE(dv_id, 0) in Snowflake.
Basically:
BigQuery:
to_hex(dv_id)
Snowflake:
hex_encode(dv_id, 0)
are equal and will create string-representation of the binary-key in lowercase.


Formatter dedents after typing inline comment

TypeScript Version:  nightly (2.5.0-dev.20170629)
Code
function f() {
	f();
}

Navigate inside the parentheses in f() and type /*comment*/
Expected behavior:
function f() {
	f(/*comment*/);
}

Actual behavior:
function f() {
f(/*comment*/);
}

Seems not to repro locally for me.


Update gemspec

Fix homepage URL
Get the version from version.rb (less duplication)

Closes #341

Huh, I just noticed that as of this morning the Gemnasium link no longer works and is now showing this

It links to a shutdown page by our friendos over at GitLab 😅 with this link: https://docs.gitlab.com/ee/user/project/import/gemnasium.html
Since Github now supports security alerts using the dependency graph, maybe we can get rid of that badge and enable it for this repo?

@dpmex4527 Sure, no problem. Please re-check. If you think this looks fine, I'll go ahead and merge and then try to do a release asap.

Since Github now supports security alerts using the dependency graph, maybe we can get rid of that badge and enable it for this repo?

Good point; I already removed the gemnasium badge actually. Will activate security alerts also, if it's not already there.


Application Token Lifecycle Report

Describe your problem(s)
As a customer I would like to have a report regarding the application token lifecycle: when it was created, renew date, expiration time, last used, and so on. Also, to identify users who have generated token with a -1 never expire token time.
Describe your solution
It is better if this feature is available for the Admin users to access via Admin portal.
How will you implement it

Optional Fields
Related Issues:

Suggested Labels:

Suggested Assignees:

+1

+1


Feature/tolerations and node selector inputs

Signed-off-by: Zane Williamson<EMAIL_ADDRESS>Describe your changes
Extending the Custom Options API to include podOptions to support Tolerations and Node Selector inputs for both SolrCloud StatefulSet and PromExporter Deployment
Updated readme NAMESPACE value to include forward slash
Testing performed
Added unit test to validate found and expected Tolerations and Node Selector values
Tested in local docker and dev environment

We can make the same changes for the SolrPrometheusExporter. I'd look in these two places:
https://github.com/bloomberg/solr-operator/blob/master/controllers/util/zk_util.go#L383
https://github.com/bloomberg/solr-operator/blob/master/controllers/util/prometheus_exporter_util.go#L219

We can make the same changes for the SolrPrometheusExporter. I'd look in these two places:
https://github.com/bloomberg/solr-operator/blob/master/controllers/util/zk_util.go#L383
https://github.com/bloomberg/solr-operator/blob/master/controllers/util/prometheus_exporter_util.go#L219

I did for prometheus exporter already: https://github.com/bloomberg/solr-operator/pull/107/files#diff-50635f351caf6e78f4f33fec707bd8f4 was there another change for this service I am missing?
Ill look at the zk_util.go and add there.

We can make the same changes for the SolrPrometheusExporter. I'd look in these two places:
https://github.com/bloomberg/solr-operator/blob/master/controllers/util/zk_util.go#L383
https://github.com/bloomberg/solr-operator/blob/master/controllers/util/prometheus_exporter_util.go#L219

We can make the same changes for the SolrPrometheusExporter. I'd look in these two places:
https://github.com/bloomberg/solr-operator/blob/master/controllers/util/zk_util.go#L383
https://github.com/bloomberg/solr-operator/blob/master/controllers/util/prometheus_exporter_util.go#L219

I did for prometheus exporter already: https://github.com/bloomberg/solr-operator/pull/107/files#diff-50635f351caf6e78f4f33fec707bd8f4 was there another change for this service I am missing?
Ill look at the zk_util.go and add there.

Ok updated zk_util.go

Ah can't believe I missed that.  The code looks good to me though

No problem! Thanks for taking a look! I added a couple tests too


Proposal for trailers

I've briefly touched on this with both @jamescridland and @tomrossi7 but I think there could be something in trailers, having trailers in the items block is great amongst episodes but I've come across a few occasions where trailers drop off of shows because they've got a limit of say 300 and they hit episode 301, boom the trailer is gone.
Now we can fix it of course by pinning the episode to the RSS at all times and removing the last episode but that does feel like a hacky way to do it.
What could we potentially do for trailers/pinned episodes inside RSS feeds? I'm not here to bloat RSS feeds by any means but I feel like we could do something better.

@KieranMcKeefery There is wording for a single <podcast:alternateEnclosure> to live in the Channel to provide something like this.  Thoughts?
I know the name "alternateEnclosure" doesn't fit for this application.  But, RFSM:  "It totally doesn't matter what we call it. We can learn to use anything. There are more important things to spend time on." :-)

Food for thought: There's an argument for letting the feed support both 1 trailer to define the show, and various trailers.
A pod can release a new trailer for each new season, for example. However, a non-seasonal show could also just have 1 trailer they always want to feature.
Not proposing a solution, here, though. ;/

That's great to point out! We do already have that in the iTunes namespace with the use of episode type, episode number, and season number. So I agree with Stacey that we need to ensure whatever we do supports that same level of flexibility, if not more.

What are we thinking here?  A <podcast:trailer> tag in the channel to start with as a proposal?  If so, I can write it up for phase 2 and we can start banging on it.

Or maybe @KieranMcKeefery wants to write it up?

I recommend innovating on Apple's foundation. They use <itunes:episodeType>, which is far more versatile than creating more tags. At least at the <item> level.
I suppose we could have a <channel>-level trailer tag of some sort, but that seems a bit redundant since you can do the same thing with the items, and there's precedence for that among several apps. The only benefit I can see to a non-episode trailer tag would be giving the ability to have a podcast trailer without showing that trailer in the feed.

+1

I had some similar ideas a while ago and called it Podcast Statistics EXchange Format (=PSEXF) which would be similar as described here. Wanted to use the data described in the IAB specs.
Does somebody here know what or in which form Spotify Partners get the podcast statistics delivered? Might be worth a look.
.

Could we consider adding some addition information for a trailer? Like a language tag? I would love to have trailer in several languages (even if my content is only in one language).
.

I’m down with that. Adding a language attribute seems appropriate to me.

Do we not have one in the RSS spec anyway?
How likely is the use-case that the trailer would be in a different language to the podcast it describes?

Or maybe @KieranMcKeefery wants to write it up?

Sorry @daveajones I'm not sure how I missed this - feel free to write it up.
I think we continue to use Apple's trailer tag for the seasonal approach but I think this is more channel specific

I've come across a few occasions where trailers drop off of shows because they've got a limit of say 300 and they hit episode 301, boom the trailer is gone.

Paged feeds, as discussed in #117, would eliminate the need for a feed limit. That trailer at position 1 would always be there. This would not provide as much functionality as a trailer tag of some sort, but it might solve the described problem of trailers (and episodes) getting "chopped off" at the bottom end of a feed.

@KieranMcKeefery What do you think about the way I wrote up the trailer tag in the README under the phase 3 section?  Can you guys work with that structure?

@staceygoers Would the tie-in with podcast:season work for you guys as well?

That seems sharp! It could be even cooler if apps DID display multiple seasonal trailers, so that if a user wanted to "taste" the trailers for season 1/2/3, they could. But it's likely the default of pub:date makes sense.
LMK if that was not the section you wanted me to dive into ... :)

@KieranMcKeefery What do you think about the way I wrote up the trailer tag in the README under the phase 3 section? Can you guys work with that structure?

We can work with that for sure, looks great.

Anyone else have thoughts or concerns about this tag?  If not, I think it's ready to finalize.  It's a fairly simple structure.

I'm finalizing this tag.  Barring any changes between now and 6/1/21 it will be formalized into the namespace.


Extract swap app allowance into helper

Summary
Swap decoded is restricted to certain allowed apps. Now that we are decoding swap orders/transfers and TWAP orders, this check occurs in several places. There are dedicated isAppAllowed methods for both swap and TWAPs.
This extracts the multiple methods in a new SwapApps helper, calling it in every places instead.
Changes

Create and import SwapAppsHelper
Replace all calls to isAppAllowed with that from the above helper
Add/update tests accordingly

Pull Request Test Coverage Report for Build<PHONE_NUMBER>
Details

19 of 31 (61.29%)  changed or added relevant lines in 8 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage increased (+0.09%) to 48.453%

Changes Missing Coverage
Covered Lines
Changed/Added Lines
%

src/routes/transactions/mappers/common/swap-order.mapper.ts
2
3
66.67%

src/routes/transactions/mappers/transfers/swap-transfer-info.mapper.ts
2
3
66.67%

src/routes/transactions/mappers/common/twap-order.mapper.ts
2
5
40.0%

src/routes/transactions/transactions-view.service.ts
1
4
25.0%

src/routes/transactions/helpers/swap-apps.helper.ts
9
13
69.23%

Totals

Change from base Build<PHONE_NUMBER>:
0.09%

Covered Lines:
4238

Relevant Lines:
7026

💛  - Coveralls


Less asserts where error messages will work

Summary
From a discussion in discord, train is causing asserts due to checking the level higher than you current, which causes expForLevel to assert. I added an error message to train(), and changed the assert in expforlevel into a min0 max49 so we won't have this problem again.
Also, an assert in emails that shouldn't be needed, and 2 returns that are needed to prevent asserting.

A quick note. Either way is fine, but In lieu of a constant: m_experience_and_debt_per_level.m_ExperienceRequired.size() equates to 49.


phinx version >=0.8.1 enabled

Enable using higher phinx versions - as stated in README.

Thank you for the PR.
I don't like the idea of setting the version constraint to >=0.8.1. Because this would allow the user to install literally any version higher than 0.8.1, and I'd prefer to stay in control of this a bit more.
I'd prefer to change it to ^0.8.1||^0.9.0||^0.10.0 and update that as we go.

Applogies for the delay, thanks for your contribution


Discussion - ResponseGenerators should not build F[Response[F]]

Currently the ResponseGenerators generate F[Response[F]].  For example:
val response: IO[Response[IO]] = Ok("hello")

Now if I introduce some database access, I might have something like:
val userFromDb: IO[User]
val response: IO[Response[IO]] = userFromDb.flatMap { user =>
   Ok("hello ${user}")
}

I think this code isn't ideal as there is no IO involved in defining the response (streaming it maybe, not objecting to that).   I think the code should ideally be (all I've changed is a flatMap to a map):
val userFromDb: IO[User]
val response: IO[Response[IO]] = userFromDb.map { user =>
   Ok("hello ${user}")
}

This is a simplistic example.  If I wanted to introduce the Free monad, then currently I'd end up with:
type Script[A] = Free[Actions, A]
val userFromDb: Script[User]
val response: Script[Response[Script]] = userFromDb.flatMap { user =>
   Ok("hello ${user}")
}

However Script[Response[Script]] is not what I want.  I'd like to build a Script[Response[IO]].  At the controller layer I'm happy for the inner IO to be present, but I'd still like to represent the overall application with Free.
In summary, I wanted to discuss changing the ResponseGenerator to build a Response[F], not a F[Response[F]].

Through http4s-0.18, encoding a body was an effect: An EntityEncoder returned F[Entity] rather than Entity , so we had no choice.  Now we do.
If we were to make this change, it would have a big effect on simpler routes:
case GET -> "health-check" =>
  Ok("I'm alive")

Becomes
case GET -> "health-check" =>
  Ok("I'm alive").pure[F]

That response generator DSL has been effectful for years, so this would be a massive breaking change.
More thoughts on a free monad later, but I'm late for a meeting.  If I haven't responded in 24 hours, give me a nudge.  Also curious what others think.

To add to Luke's comment about Free monad, you end up with a Script[Response[Script]] and you're unable to write a natural transformation from that to IO[Response[IO]].
I do understand that this would have a big effect on simple routes though!

This still works, right?
userFromDb.map { user => Response[IO](Ok).withEntity(s"hello $user") }

i.e., you can do it with the functions on Message, just not the syntax from ResponseGenerator?

Actually the above didn't work.  Message.withBody also wraps the result in IO.
  def withBody[T](b: T)(implicit F: Monad[F], w: EntityEncoder[F, T]): F[Self] =
    w.toEntity(b).flatMap { entity =>
      val hs = entity.length match {
        case Some(l) =>
          `Content-Length`
            .fromLong(l)
            .fold(
              _ =>
                F.pure {
                  Message.logger.warn(s"Attempt to provide a negative content length of $l")
                  w.headers.toList
              },
              cl => F.pure(cl :: w.headers.toList))
        case None => F.pure(w.headers)
      }
      hs.map(newHeaders => change(body = entity.body, headers = headers ++ newHeaders))
    }

Was withEntity a typo, or does that behave differently to withBody?

withBody was deprecated in favor of withEntity when EntityEncoder became pure instead of effectful:
  @deprecated("Use withEntity", "0.19")
  def withBody[T](b: T)(implicit F: Applicative[F], w: EntityEncoder[F, T]): F[Self]

  def withEntity[T](b: T)(implicit w: EntityEncoder[F, T]): Self

Ok.  Still on 0.18 so will have to upgrade at some point.
Thanks again for all the great work and responding to this.


Use overlay 3.0

Fixes #114

This change is

a discussion (no related file):
Should depend on "vaadin-overlay": "^3.0.0"

Comments from Reviewable

Reviewed 1 of 1 files at r1, 1 of 1 files at r2.
Review status: all files reviewed at latest revision, 1 unresolved discussion, some commit checks broke.

demo/dropdown-menu-basic-demos.html, line 134 at r2 (raw file):

          }
        </style>
        <vaadin-dropdown-menu placeholder="Language" value="ES">

Nit: "Language" and "ES" here, but the items are names, not languages.
Since the value and the placeholder are explained in the other demo, we can skip them here. label="Name" should be enough.

demo/dropdown-menu-basic-demos.html, line 136 at r2 (raw file):

        <vaadin-dropdown-menu placeholder="Language" value="ES">
          <template>
            <style>

Style inside the template is not supported. Please don’t use.
Technically this style applies, but it’s lacking a proper scoping when using with ShadyDOM.

Comments from Reviewable

Review status: 1 of 2 files reviewed at latest revision, 3 unresolved discussions.

demo/dropdown-menu-basic-demos.html, line 134 at r2 (raw file):
Previously, platosha (Anton Platonov) wrote…
Nit: "Language" and "ES" here, but the items are names, not languages.
Since the value and the placeholder are explained in the other demo, we can skip them here. label="Name" should be enough.

Updated.

demo/dropdown-menu-basic-demos.html, line 136 at r2 (raw file):
Previously, platosha (Anton Platonov) wrote…
Style inside the template is not supported. Please don’t use.
Technically this style applies, but it’s lacking a proper scoping when using with ShadyDOM.

Done.

Comments from Reviewable

Review status: 1 of 3 files reviewed at latest revision, 3 unresolved discussions.

a discussion (no related file):
Previously, tomivirkki (Tomi Virkki) wrote…
Should depend on "vaadin-overlay": "^3.0.0"

Done.

Comments from Reviewable

a discussion (no related file):
Behaviour of the element has changed. Now the overlay no longer closes once you select an item from the list. We should have a test that verifies this.

Comments from Reviewable

demo/dropdown-menu-basic-demos.html, line 130 at r3 (raw file):

          vaadin-item[selected] {
            font-style: italic;
            border-bottom: .25em solid var(--lumo-success-color-50pct);

This makes the demo feel jumpy. Not a blocker.

Comments from Reviewable

a discussion (no related file):
Previously, tomivirkki (Tomi Virkki) wrote…
Behaviour of the element has changed. Now the overlay no longer closes once you select an item from the list. We should have a test that verifies this.

Actually, the clicked item doesn't even get selected.

Comments from Reviewable

Review status: 0 of 3 files reviewed at latest revision, 3 unresolved discussions.

a discussion (no related file):
Previously, tomivirkki (Tomi Virkki) wrote…
Actually, the clicked item doesn't even get selected.

Fixed

demo/dropdown-menu-basic-demos.html, line 130 at r3 (raw file):
Previously, tomivirkki (Tomi Virkki) wrote…
This makes the demo feel jumpy. Not a blocker.

Update to box-shadow

Comments from Reviewable

Reviewed 1 of 2 files at r3, 3 of 3 files at r4.
Review status: all files reviewed at latest revision, 3 unresolved discussions, some commit checks broke.

Comments from Reviewable

Reviewed 2 of 3 files at r4.
Review status: all files reviewed at latest revision, 1 unresolved discussion.

src/vaadin-dropdown-menu.html, line 373 at r4 (raw file):

          this._overlayElement.template = template;
          if (this._overlayElement.content) {
            this._menuElement = Array.from(this._overlayElement.content.children).filter(element => element.shadowRoot)[0];

Hm-m, having a shadow root does not feel like the right criteria. Should filter out the styles, then pick the first child element.

Comments from Reviewable

Review status: 3 of 4 files reviewed at latest revision, 2 unresolved discussions.

src/vaadin-dropdown-menu.html, line 373 at r4 (raw file):
Previously, platosha (Anton Platonov) wrote…
Hm-m, having a shadow root does not feel like the right criteria. Should filter out the styles, then pick the first child element.

Done.

Comments from Reviewable

Review status: 3 of 4 files reviewed at latest revision, 2 unresolved discussions.

demo/dropdown-menu-basic-demos.html, line 133 at r5 (raw file):

            box-shadow: inset 0 -3px 0 0 var(--lumo-success-color-50pct);
            -webkit-box-shadow: inset 0 -3px 0 0 var(--lumo-success-color-50pct);
            -moz-box-shadow: inset 0 -3px 0 0 var(--lumo-success-color-50pct);

no need in prefixes: https://caniuse.com/#feat=css-boxshadow

Comments from Reviewable

Reviewed 1 of 1 files at r5.
Review status: all files reviewed at latest revision, 2 unresolved discussions.

Comments from Reviewable

Reviewed 1 of 1 files at r5.
Review status: all files reviewed at latest revision, 2 unresolved discussions.

Comments from Reviewable

demo/dropdown-menu-basic-demos.html, line 130 at r3 (raw file):
Previously, YuriyVaadin (Yuriy Yevstihnyeyev) wrote…
Update to box-shadow

Ok, but drop the prefixes as @limonte suggests below

Comments from Reviewable

Review status: 3 of 4 files reviewed at latest revision, 1 unresolved discussion.

demo/dropdown-menu-basic-demos.html, line 130 at r3 (raw file):
Previously, tomivirkki (Tomi Virkki) wrote…
Ok, but drop the prefixes as @limonte suggests below

Done.

demo/dropdown-menu-basic-demos.html, line 133 at r5 (raw file):
Previously, limonte (Limon Monte) wrote…
no need in prefixes: https://caniuse.com/#feat=css-boxshadow

Done.

Comments from Reviewable

Reviewable is crashing itself, can't use it for this PR :/
LGTM, but fix iOS 9 tests before merging.

This is a random failure that was introduced before. I will try to take care of that in separated PR.

Review status: 3 of 4 files reviewed at latest revision, all discussions resolved.

Comments from Reviewable


Finish adding codesake-dawn to pipeline

I rule and have completed some work on Case Manager that's ready for review!
Resolves some trouble spots in #470 and primps for merge.
This pull request makes the following changes:

Jumps off @ewiggins hard work to add dawnscanner to our safety pipeline

It relates to the following issue #s:

Fixes #390

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

Merging [#495][cc-pull] into [master][cc-base-branch] will not change coverage

@@             master       #495   diff @@
==========================================
  Files            23         23
  Lines           368        368
  Methods           0          0
  Messages          0          0
  Branches          0          0
==========================================
  Hits            366        366
  Misses            2          2
  Partials          0          0

Powered by Codecov. Last updated by [d471c50...817fad8][cc-compare]
[cc-base-branch]: https://codecov.io/gh/colinxfleming/dcaf_case_management/branch/master?src=pr
[cc-compare]: https://codecov.io/gh/colinxfleming/dcaf_case_management/compare/d471c502e1122f008ceaeba4410dee0ff1d78f97...817fad8a534bdfbca6aaee1217a215a87e85bfa7?src=pr
[cc-pull]: https://codecov.io/gh/colinxfleming/dcaf_case_management/pull/495?src=pr


RDK-52316 : Content Protection service

Reason for change: new service to proxy content security capabilities of the existing DRM plugins like SecManager & Watermark and provide a single unified interface.
Test Procedure: None
Risks: None
Signed-off-by: Nikita Poltorapavlo<EMAIL_ADDRESS>

b'## Blackduck scan failure details
Summary: 0 violations, 0 files pending approval, 1 file pending identification.

Protex Server Path: /home/blackduck/github/rdkservices/5790/rdkcentral/rdkservices

Commit: 6e547ce3526e71d8c5c73bf96a18165aaa2ca66d

Report detail: gist'

b'## Blackduck scan failure details
Summary: 0 violations, 0 files pending approval, 1 file pending identification.

Protex Server Path: /home/blackduck/github/rdkservices/5790/rdkcentral/rdkservices

Commit: 7055b4620d68e0394ff4f4d8e4de207ea76a9ecc

Report detail: gist'

b'## WARNING: A Blackduck scan failure has been waived
A prior failure has been upvoted

Upvote reason: OK

Commit: 7055b4620d68e0394ff4f4d8e4de207ea76a9ecc
'


insertions.fa contains no insertion sequences

Hi,
I'm running SURVIVOR v1.0.7 and I'm generating a simulated genome sequence with SVs in order to map my own reads to it and call SVs.
First I'm generating a parameters file:
$ SURVIVOR simSV test_params.param
Output (I've increased the INDEL_value to ensure insertions):
PARAMETER FILE: DO JUST MODIFY THE VALUES AND KEEP THE SPACES!

Sometimes when I run SURVIVOR simSV to generate the SVs simulated.insertions.fa  is totally empty, and sometimes it's not empty, but contains only the fasta header line of the insertions:
$ cat simulated.insertions.fa
>Chr3_45180

>Chr3_869844

>Chr2_4354418

>Chr1_4982876

I've run SURVIVOR simSV a number of times, using around 5 different param files (using different SV min/max sizes) and this behaviour is constant. However, when I run simSV with option 3=0, my insertions.fa file contains the insertions.
Perhaps I've misunderstood something here, but intuitively I would presume that using option 3=1 (simulate genome), the insertions.fa would be the actual insertions in the simulated genome as using option3=0 (simulate reads), insertions.fa would be empty as the insertions are generated by SURVIVOR simreads which doesn't require the insertions.fa file.

Hi Graham,
sorry for this. Do you see the ins in the VCF file ?
Thanks
Fritz

Hi Friz,
Yes, they're at the end. Here are the VCF entries
Chr3	45180	INS1487952SURVIVOR	N	<INS>	.	LowQual	PRECISE;SVTYPE=INS;SVMETHOD=SURVIVOR_sim;CHR2=Chr3;END=45341;SVLEN=161	GT:GL:GQ:FT:RC:DR:DV:RR:RV	1/1
Chr3	869844	INS1487955SURVIVOR	N	<INS>	.	LowQual	PRECISE;SVTYPE=INS;SVMETHOD=SURVIVOR_sim;CHR2=Chr3;END=870223;SVLEN=379	GT:GL:GQ:FT:RC:DR:DV:RR:RV	1/1
Chr2	4354418	INS1487961SURVIVOR	N	<INS>	.	LowQual	PRECISE;SVTYPE=INS;SVMETHOD=SURVIVOR_sim;CHR2=Chr2;END=4354910;SVLEN=492	GT:GL:GQ:FT:RC:DR:DV:RR:RV	1/1
Chr1	4982876	INS1487964SURVIVOR	N	<INS>	.	LowQual	PRECISE;SVTYPE=INS;SVMETHOD=SURVIVOR_sim;CHR2=Chr1;END=4983124;SVLEN=248	GT:GL:GQ:FT:RC:DR:DV:RR:RV	1/1

Also, when I map real reads to the simulated reference with Minimap2, and use Sniffles to call SVs, I also get them reported in eval_simulated_right.vcf

ok that might be the best workaround for now.  Sorry about this . Lately I was more focused on the VCF file than the fasta file..
Cheers
Fritz


Update copy

Needs reflow before we merge!

@blake213 can you take a look at how this renders locally (you can run bin/serve then navigate to http://<IP_ADDRESS>:8080 to see how it lays out)?


Remove unnecessary widget state update after app update.

Fixes aiidalab issue #145.

@yakutovicha I believe this should fix https://github.com/aiidalab/aiidalab/issues/145 .
All tests are failing, but there appears to be an issue with the runner (docker-compose fails to start). I'll investigate, but this appears unrelated to the actual fix here.


Add optional args in chip-tool and end point optional arg

Problem

Add optional arguments to chip-tool
Add ability to set EndPoint ID on chip tool command run.
Issued Here #11100

Change overview
In chip-tool add an argument that will allow adding optional arguments. Optional arguments. ZAP file updates to add the optional flag to false.
Testing

Tested Zap generation with the generate command.
Testsed compilation with ninja
Tested chip-tool optional arguments.
Tested pairing command.
Tested tests command in chip-tool.

Fast tracking given this is a test tool.

@krypton36 it looks like @vivien-apple added something along these lines (but with different semantics?  Not sure whether it works right?) in #11729, so at the very least this will need to get rebased on top of that.... :(

I am closing this PR and enhancing Vivian's PR for the optional arguments to avoid conflict nightmares.

Makes sense, but I wish we were talking to each other more....Ah, well.


How to install and use GPU-supported MediaPipe on a Linux platform?

Have I written custom code (as opposed to using a stock example script provided in MediaPipe)
None
OS Platform and Distribution
How to install and use GPU-supported MediaPipe on a Linux platform?
Python Version
How to install and use GPU-supported MediaPipe on a Linux platform?
MediaPipe Model Maker version
How to install and use GPU-supported MediaPipe on a Linux platform?
Task name (e.g. Image classification, Gesture recognition etc.)
How to install and use GPU-supported MediaPipe on a Linux platform?
Describe the actual behavior
How to install and use GPU-supported MediaPipe on a Linux platform?
Describe the expected behaviour
How to install and use GPU-supported MediaPipe on a Linux platform?
Standalone code/steps you may have used to try to get what you need
How to install and use GPU-supported MediaPipe on a Linux platform?

Other info / Complete Logs
How to install and use GPU-supported MediaPipe on a Linux platform?

Hi @caochengchen,
To utilize GPU in Python, start by installing the latest version of the MediaPipe package using the command "pip install mediapipe." Next, specify the GPU as the delegate, as illustrated in the example provided for the gesture recognition in the BaseOptions. It's important to note that this functionality is currently supported only on macOS and Linux, not on other operating systems.
base_options = python.BaseOptions(model_asset_path='gesture_recognizer.task', delegate=python.BaseOptions.Delegate.GPU)
This will guarantee that the example runs on the GPU. Additionally, If you encounter any further issues, please inform us.
Thank you!

base_options

Is there a complete example code? Do I need to download base_options?

Hi @caochengchen,
You can find an example on the overview page here. For instance, if you want to use the GPU for gesture recognition, you need to pass the GPU delegate in the base option, as shown in the example below.
base_options = python.BaseOptions(model_asset_path='gesture_recognizer.task', delegate=python.BaseOptions.Delegate.GPU
Thank you!!

base_options

Is it possible to simultaneously recognize the 3D coordinates of both hands and the body? If so, is there any sample code available?

Hi @caochengchen,
We believe this is outside the scope of MediaPipe. Currently, we have not tested this scenario, and a sample example is not available. However, if you think this should be a feature, please raise a new feature request with complete details. Based on future demand and discussion, we may consider adding it.
Thank you!!

Hi @caochengchen,
We believe this is outside the scope of MediaPipe. Currently, we have not tested this scenario, and a sample example is not available. However, if you think this should be a feature, please raise a new feature request with complete details. Based on future demand and discussion, we may consider adding it.
Thank you!!

Currently, can only detect 3D key points of the hand?

Hi @caochengchen,
At this time, directly calculating 3D keypoints is not supported. Currently, keypoints are identified in 2D and then converted to 3D.
Thank you!!


Create _redirect file for netlify

Currently prs are struggling because netlify's redirect rules. I would like to add the redirect file for netlify

Can you please elaborate more and explain with an example

Currently, the hosted website in netlify has an issue.
suppose you go to contact page which is on https://social-scheduler.netlify.app/contact it will work just fine but if you refresh the page it will page not found error from netlify. Also when you try to go to any route manually by typing the link in the browser search you will get this same error.

@smaranjitghose will you please assign me this issue.

my previous pr was approved but not merged yet, so when I pushed the code for this issue it went there. #35

@smaranjitghose this error issue is fixed, when you merged the #35

@Souvikns I think this issue is solved?? I'm closing it. If some work is still left let me know, I'll re open it!


Analyser finds extension, but it wont compile

I have a file which looks like the following (you can test this error in dartpad.dev):
void main() {}

class Filter<T extends Filterable?, E extends Object?> {
  const Filter({
    required this.column,
    required this.filter,
  });

  final int column;
  final List<E> filter;

  bool test(T object) {
    if (object == null) return false;
    return filter.map(_constEmptyList).contains(
          object
              .when(_notEmptyList, otherwise: (_) => const [] as T)!
              .column(column),
        );
  }

  bool _notEmptyList(T self) {
    return (self is! List) || ((self as List).isNotEmpty);
  }

  R _constEmptyList<R>(R e) {
    return ((e is List) && e.isEmpty) ? const [] as R : e;
  }
}

mixin Filterable {
  T column<T extends Object?>(int index);
}

extension _When<T extends Filterable> on T {
  T? when(bool Function(T self) predicate, {T Function(T self)? otherwise}) {
    if (predicate(this)) return this;
    return otherwise?.call(this);
  }
}

It gives the following output:
Error compiling to JavaScript:
Info: Compiling with sound null safety.
lib/main.dart:16:16:
Error: The method 'when' isn't defined for the class 'Filterable'.
 - 'Filterable' is from 'package:dartpad_sample/main.dart' ('lib/main.dart').
              .when(_notEmptyList, otherwise: (_) => const [] as T)!
               ^^^^
Error: Compilation failed.

I'm not sure this is intended behaviour, but for me, it doesn't seem like that mostly because (as said in the title) Analyser tells me nothing is wrong.

@johnniwinther, do you agree that the extension _When should be applicable to a receiver of type T & Filterable?

Originally, I had this extension with T extends Object but when I got the error I figured it had something to do with the fact that Filterable is a mixin, so I changed it. For everything else in my code, this extension for T extends Object works just fine.

Interesting! But the example I gave still causes a compile-time error with class Filterable {}.

Maybe it has something to do with linter/#4277?

It looks like the problem could be that while T & Filterable (which is NonNull(T extends Filterable?) is a subtype of Filterable, it's not a valid type argument to extension _When<X extends Fiterable>, because intersection types are not valid type arguments to begin with.
So, to invoke the extension, the compiler would have to choose either T or Filterable as the actual type argument, with only Filterable actually being valid. It likely chose T, because that's how intersection types are usually reduced to a single type.
Or maybe it does just look at T & Filterable and refuses to apply the extension, it's just very clever about giving an error message saying precisely which extension it is that it's not applying.
(But T & Filterable then prints as Filterable in the error message, which makes things very confusing, since Filterable itself clearly should work with the extension.)

It looks like the problem could be that while T & Filterable (which is NonNull(T extends Filterable?) is a subtype of Filterable, it's not a valid type argument to extension _When<X extends Fiterable>, because intersection types are not valid type arguments to begin with.
So, to invoke the extension, the compiler would have to choose either T or Filterable as the actual type argument, with only Filterable actually being valid. It likely chose T, because that's how intersection types are usually reduced to a single type.
Or maybe it does just look at T & Filterable and refuses to apply the extension, it's just very clever about giving an error message saying precisely which extension it is that it's not applying. (But T & Filterable then prints as Filterable in the error message, which makes things very confusing, since Filterable itself clearly should work with the extension.)

This explanation, at least for me, really seems to fit the dart-lang/linter#4277 error.

I think the analyzer has issues too:
void main() {
  foo<List<int>?>([1]);
}

foo<T extends List<int>?>(T list) {
  if (list is List<int>) {
    // Promoted type T&List<int>
    List<int> l1 = list;
    T l2 = list;
    list.st<Exactly<T>>(); // When used to solve <T>, it become
    // list.st<Exactly<List<int>>>();
    list.foo;
    list.bar;
    list.baz;
    list.baz.st<Exactly<T>>(); // Unsound
  }
}

extension <S> on S {
  void st<X extends Exactly<S>>(){}
}

extension on List<int> {
  List<int> get foo {
    print("foo: List<int>");
    return this;
  }
}

extension <S> on S {
  S get bar {
    print("bar: $S");
    return this;
  }
}

extension <S extends List<int>> on S {
  S get baz {
    print("baz: $S");
    return this;
  }
}

typedef Exactly<T> = T Function(T);

(https://dartpad.dev/?id=f2bd890540648e55221aa5d6dbf8e469)
The lines:
    list.st<Exactly<T>>();
    // list.st<Exactly<List<int>>>();

show that the actual type argument passed to the extension is T, not List<int>. The second line is commented out because it's an error in both front-end and analyzer.
However, the front-end says that baz does not apply to list. One could argue that it should, but intersection types can make it not apply anyway, if it's not possible to choose the correct type argument.
The analyzer gives no error, and the line
    list.baz.st<Exactly<T>>(); // Unsound

shows (probably, always hard to be absolutely sure) that the type argument actually passed to baz is T.
That is an invalid type argument, since T is not a subtype of List<int>, it's not a valid type argument to the extension of baz, which has type parameters <S extends List<int>>.
So, analyzer is doing something very wrong here, so it's not obvious that it's the front-end which is being wrong.

Dart type inference is partially specified in inference.md, but it does not cover the situation where an intersection type is the static type of the receiver of an invocation which might call an extension method.
I've create https://github.com/dart-lang/language/issues/3012 in order to reach a conclusion about which rules we want. This issue may then be used to handle the implementation of the given approach, possibly with two subissues area-front-end and area-analyzer if needed.
@lrhn, I'd recommend that you create new issues if this comment shows unexpected behaviors in the analyzer that aren't covered by the intersection-type/extension-method topic which was the starting point for this issue.

I gave a look at inference.md, and I have another question, that I couldn't understand reading that file.
Why does when I do a code like the following, it gives me Object even when it could give me num?
extension _When<R extends Object, T extends R> on T {
  R? when(R Function(T) fn) => null;
}

void main() {
  final number = 1; // int
  final result = number.when((_) => 1.2);
}

If this type of generics doesn't work, shouldn't it be warned with a lint?

It is rarely useful for an extension to declare a type parameter whose value is unconstrained by the on type of the extension (in this example: R), because that type variable will always be inferred to have the value which is the declared bound.
The reason for this is that all actual type arguments for the extension are inferred (unless provided explicitly) based on the static type of the receiver, with no input from any other source. In particular, the context type is _. This means that a type variable like R has no constraints other than the bound, and it will then be inferred as that bound.
However, the example doesn't provide any justification for the relationship T extends R. Why don't you just do this?:
extension _When<T> on T {
  R? when<R extends Object>(R Function(T) fn) => null;
}

If you do need the relation T extends R then I'm afraid you will need a lower bound, which is a feature that we do not (yet) have in the language:
extension _When<T> on T {
  R? when<R extends Object super T>(R Function(T) fn) => null;
}

We could also consider an approach where you handle the same computation using a regular function. This means that the receiver will now be the first argument, and remaining arguments are pushed back to position 2, 3, etc. The point is that this makes the type arguments dealing with the "receiver" and the type arguments dealing with the arguments available at the same time, hence allowing us to specify a larger set of relationships:
R? when<R extends Object, T extends R>(T self, R Function(T) fn) {
    print('R: $R, T: $T');
    return null;
}

void main() {
  final number = 1; // int
  final result2 = when(number, (_) => 1.2); // Error, inference failed. `<num>` would work.
}

There is a special difficulty here, because type inference would need to process the actual arguments of the invocation as a group in order to know that it needs to use num as the actual type argument.
The current approach causes the arguments to be split into phases (because the first argument has type T and the second argument is a function literal whose parameter type is also T, so the type of fn depends on the type of self), and the phasing allows those dependencies to be taken into account. This was a very significant improvement when it was added in 2.18.
However, in this particular case it isn't sufficient, because there is a need to flow information in the other direction: returning 1.5 implies that double <: X must hold, so we can't use X == int based on the argument passed to self alone.
See https://github.com/dart-lang/language/issues/3013 where this difficulty is reported.

Thank you for your explanation. Just so you understand better why I was asking this.
I have as you've seen, this extensionÇ
extension When<T extends Object> on T {
  T? when(bool Function(T self) predicate, {T Function(T self)? otherwise}) {
    if (predicate(this)) return this;
    return otherwise?.call(this);
  }
}

This is used by me mostly inside Flutter projects since everything is mostly a one-line code, I sometimes find myself having to test for something (even more useful when is some nested value) so I actually use this extension for those cases.
But, some days ago I tried to use this extension to set a Widget on my screen, since it has only one type parameter it was telling me the other widget wasn't of the same type T. To solve that I've done the following:
extension WhenWidget<T extends Widget> on T {
  T? when(bool Function(T self) predicate, {T Function(T self)? otherwise}) {
    if (predicate(this)) return this;
    return otherwise?.call(this);
  }
}

This solves my case because is more specific so it infers that it should be used. Only asked because if I end up having to do more of these extensions, I will have a lot of work having to create one more for every more specific type.

As commented in https://github.com/dart-lang/language/issues/3013, this is an analyzer bug, as things are currently specified (at least based on the extension method feature specification, haven't checked the language spec integration of that).
The type inference applied to object.when should behave the same as other inferences where a type argument is found from an intersection type, which means falling back to the type variable.
That type variable is not a valid type argument to the extension, which means the extension is not applicable, and therefore the front-end behavior of saying "no when method declared" is correct.
(The error message is confusing, it should say, Error: The method 'when' isn't defined for the type 'T & Filterable'. Bonus points for saying that the extension WhenWidget does not apply, because T is not a valid type argument to it.)

It's not the same. This code is just not type-sound.
(I assume late NumberFormatter<T> formatted; should be late NumberFormatter<T> formatter;, or the assignement should be formatted = ..., but I'm guessing the former.)
I can derive why you get the type that you do, but the bigger underlying problem is that _formatter is not assignable to _CustomDoubleFieldState.formatter.
The type NumberFormatterDecimal<double> (or NumerFormatter<double> for that matter) is not a subtype of NumberFormatter<T>.
Not in general. It might be for some T values, but not if T is, say, Never, and the code has to be valid for all types bound to T, otherwise the compiler will complain.
The problem is the T extends double. Why is that there, when double doesn't have any useful subtypes?
(And the reason you get TextInputFormatter is:
The static type of widget.formatter is that of CustomDoubleFIeld<T>.formatter, which is NumberFormatter?. If that's null, we go to the second operand of ??, and the static type of _formatterisNumberFormatterDecimal.  Then we try to find a common superinterface of NumberFormatterandNumberFormatterDecimal`, using the UP ("least-like upper bound") algorithm.
The implemented superinterfaces of those two are:

.formatter: NumberFormatter<T>, TextInputFormatter, Object
_formatter: NumberFormatterDecimal<double>, NumberFormatter<double>, TextInputFormatter, Object.

The least interface those two have in common is TextInputFormatter, which is better than the other alternative Object,  so thats the static type of the ??-expression.
It's then not assignable to the context type NumberFormatter<T>, which is correct.
Even with improved context-type guidance, which I don't know if we have added yet or just talked about, where we'd just give NumeberFormatter<T> back if both types are subtypes that and the UP result isn't, that won't work here, because NumberFormatterDecimal<double> was not a subtype of NumberFormatter<T>.)

I see. Thank you a lot for the explanation!

Closing this in favor of https://github.com/dart-lang/sdk/issues/53711. This discussion took many tangents and was hard for me to follow to see what our AI is. I think I've summarized and quoted the important parts over there.


閲覧履歴パーツ

Coverage increased (+0.06%) to 85.881% when pulling 3bc6ac719f403a7fe4bcb63a79c0a14f76956a92 on itowtips:recommend into 81115b8e5f0c23e8452a9a470927a4e478e07fd4 on shirasagi:master.


Calculating the OOD score using VOS in the classification task

Hello,
How can I calculate the OOD score on the classification models?
I see the "get_ood_scores" function in "vos-main/classification/CIFAR/test.py". Does this function calculate the OOD score for VOS? (or this function only relates to the baselines considered in the paper?).

Many thanks for your response!
It's great that you take time to answer the questions.

However, in the paper , the classification models does not use the learnarble weight for energy . Only the detection model use the learnable energy  weight. But in code, both the classification model and the detection model learn the energy weight. In the inference for the classification, they don't load the energy weight. Isn't it the mistake ?? Can you give me the answer??
Thanks in advance


Support file paths that contains spaces

Currently, if I run this mcp against a file that contains spaces in their name, or located in a folder that contains spaces, it will error. This PR simply adds "" around the file path to support paths containing spaces.

Good catch. Thanks @f4ww4z !


Modal component?

Would be great to have a modal component.

+1

+1

Merge into #781. Modals and Dialogs are the same concept.

:+1:  + 1

@Garbee @addyosmani : Hi, Just wanted to check any update on this ? Or anything else I can use in the mean time ?
Thanks for help.

I’ll swoop in here.
@foo-baar We literally opened the merge window for 1.1 an hour ago, so this is the very first moment we can start thinking about new features like dialogs and modals. We have definitely heard the big demand for these components and they are at the very top of the list. We just need to coordinate with the MD team and get an actual implementation ready :)

@surma : Thanks for the update, any timeline here Until we start seeing this in production/on the site ?

No timeline. However as stated this is a duplicate issue. Please keep an eye on the primary issue for updates.

@Garbee : Thanks, hope its in place soon, otherwise I'll have to move back bootstrap as this really lacks many important features needed for a business line apps.

Thought one was used in the showcase website http://styleguide.material-design-lite.pub/#/dialog

@oniseun The Dart version of MDL is not by us but by the prolific @MikeMitterer. Has has done some elements on his own that we don’t have yet.

@surma   I never knew that. Although I have used much of the css components and it worked but was surprised that modal window code wasn't working. Thanks anyway


fix(webpack): escape local path in regex for css modules

Current coverage is 47.72%

Merging #587 into master will not affect coverage as of 8a0c7d7

@@            master    #587   diff @@
======================================
  Files            6       6
  Stmts           44      44
  Branches         0       0
  Methods          0       0
======================================
  Hit             21      21
  Partial          0       0
  Missed          23      23

Review entire Coverage Diff as of 8a0c7d7

Powered by Codecov. Updated on successful CI builds.


Want to request some help with test document

Description

Hello, I am a student who wants to participate in the part of our project released in the Open Source Summer project, and I find that part of the project I want to apply for requires a complete incremental test
If I could, I would like to see some examples of past community test specs or documentation
This is my email address, if you can, I would like to connect with you, thank you very much
Email address<EMAIL_ADDRESS>

Thanks for your issue. Contributions are welcome! This post shows how to use Go to collect coverage profiles for larger programs. You can use it locally, and this library also tracks the code coverage by CodeCov for each commit. I'll close this issue, if you have any questions, please let me know to reopen this anytime.


Dynamic specifications

We would like to build a dynamic specification instead of creating a specific one.
Now we have this: CompanyNameSpecification, CompanyCountrySpecification, CompanyDeletedSpecification, and so on.
It would be better to have this: LikeSpecification(c => c.Name, "name"), DeletedSpecification();
Also, we are going to have fluent API to build a filter, something like that:
Sp
.Default()
.Like(c => c.Name, "x")
.Like(c => c.Country, "y")
.Equal(c => c.Id, "guid")
.NotDeleted()
.Spec(Sp.CustomSpec())

тут чето делаем ?


Cleaned up nested case using with block.

Very cosmetic, but I saw that the project compilation was >= 1.2, so I figured I might as well clean it up.

The {:error, reason} bubbles up because it doesn't match the with, but I can match it explicitly in a with/do/else since the compilation target is 1.3.
with {:ok, claims} <- decode_token(jwt, secret),
     {:ok, verified_claims} <- verify_claims(claims, params),
     {:ok, {claims, _}} <- Guardian.hooks_module.on_verify(verified_claims, jwt) do
  {:ok, claims}
else
  {:error, reason} -> {:error, reason}
end

Thank you @asummers 👍


Add appId as parameter to server side integration

Resolves: https://github.com/segment-integrations/integration-appboy/issues/30 and https://segment.atlassian.net/browse/EPD-2463
Merging changes made here: https://github.com/segment-integrations/integration-appboy/pull/31 as a branch within segment-integrations org.
Confirmed e2e working
cc @hankim813

Hi @aloisbarreras - this pr supersedes your original PR. We had to make some changes for our internal testing suites. Wanted to make sure you were credited though. Let me know if you have any questions. Thank you so much for your contribution.
closes #31