SpreadsheetRow.content property has gone missing

I just updated from npm yesterday and noticed that my code broke that was using node-google-spreadsheet.  I traced the problem down to an undefined object property.
The SpreadsheetRow.content property that was present in v1.0.1 seems to have vanished from 1.1.0 and above.  Is this an accident or an intentional API change?
Thanks.

Im about to roll out a very large refactoring (with lots of tests!)
What was in the .content property that is not missing?

The entire .content property is missing.  Looking at old logs from my app, it looks like .content used to contain a string of comma-separated key:value pairs where the key was a column header and the value was the value of that column, following left-to-right across the row represented by the SpreadsheetRow object.  I'd paste my log output here for you to see, but I can't because the spreadsheet in question contains confidential information.
I was able to verify that the property disappeared by comparing a util.inspect() dump of the SpreadsheetRow object from v1.0.1 to v1.1.0 (also missing from v1.1.4).  The property appears in the former but not in the latter.  In case it matters, the SpreadsheetRow object was created by SpreadsheetWorksheet.getRows().

Hmm doesnt sound very useful. So I think it's ok to leave out of this update. I'm guessing it was coming through from the xml directly, but all of the data is captured in other fields. Were you using it for anything that you can no longer do?

Well, I'm not the original developer of this code, but I inherited it for maintenance.  I can't say for certain why this particular method of accessing row content was chosen, but it looks like the original developer was relying on SpreadsheetRow.content ultimately as a way to create an array containing all of the values in a given row, in the order in which they appeared in the spreadsheet, so that he could address each value by index rather than by the name generated by the header row (row[0]).
I tried looking through old versions of your API documentation to see if I could find references to this property, but I never did find it, which makes me wonder how the original developer of my code decided to use it.  Do you recall ever officially supporting it?
Regardless, what's your recommended way to retrieve this same information, namely an array of all values in a given row, in the order in which they appear in the spreadsheet?  If I'm going to have to refactor, I figure I might as well use a well-supported method.
Also, I think you're right about .content coming from the XML.  Looking again at my logs, I see that the value inside of <entry><content></content></entry> exactly matches the value of the .content property.

I finally released a big update. .content didnt make the cut as it didnt seem very useful.
So I'm going to close this out.

That's fair, but then could you please provide an answer to my previous question:

what's your recommended way to retrieve this same information, namely an array of all values in a given row, in the order in which they appear in the spreadsheet? If I'm going to have to refactor, I figure I might as well use a well-supported method.

Thanks.

sorry I missed that question. With the current functionality, you could:

fetch the header row using getCells to get the exact header row in order
use the cells based API instead of the row-based API to fetch cells instead of the full row

But it should be fairly simple to add new functionality to make the row headers available in the order they appear in the XML. I assume the order they appear in from the XML is the same as the sheet, but it may not be.


Introduce new AccessType to allow a set of addresses

Resolves #945
Introduces a new Access type to allow a set of addresses to accept.
This PR includes a small but breaking change to the CLI. The separator char between codeID and permission is : now:
Before:
wasmd tx gov submit-proposal update-instantiate-config 1,nobody 2,everybody 3,wasm1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm

Now:
wasmd tx gov submit-proposal update-instantiate-config 1:nobody 2:everybody 3:wasm1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm,wasm1vx8knpllrj7n963p9ttd80w47kpacrhuts497x`

[x] keep or migrate AccessConfig.Address into AccessConfig.Addresses see proto? - keep and remove in a future version

Thanks for the feedback!


Jump List Support

Is your feature request related to a problem? Please describe.
I think implement cross-platform support for jump list is a good idea and a good task for someone to implement and push via PR.
Some of the users using JumpList a lot for opening recent documents. Lack of this feature affects UX of Avalonia apps.
Describe the solution you'd like
There should be a JumpListService with Add/Remove methods accepting file path.

Related macOS API - dock menu - https://github.com/AvaloniaUI/Avalonia/issues/7487.
But I am not sure if these two platform specific features can be combined into a common API.


Auto-fees enhancement: fee-rate pinning

Is your feature request related to a problem? Please describe.
Sometimes auto-fees can set oscillating fee rates on a channel. Say I have a channel that flows regularly at 2000 ppm. Auto-fees might raise the ppm to 2100, but the channel never flows at this rate. The next fee-rate adjustment moves the ppm to 1900, which flows well but leaves some fee earnings on the table. The next adjustment is to 2000 ppm which is the sweet spot. Finally, the channel is changed to 2100 again, and the forwards stop and the cycle repeats.
Describe the solution you'd like
It would be helpful to click a pin icon or something on a per-channel basis so that auto-fees stops running the adjustment algorithm on a channel. The fee-rate wont change until the pin is deselected.
Describe alternatives you've considered
To accomplish this goal, I wait until the channel is in the sweet spot and then disable auto-fees for that channel.

Thanks for the feedback as always!  It seems like the outcome would be the same, but maybe it's a UX improvement.


update ci and add job to test pull request

LGTM! Newer versions of ko default to using cgr.dev/chainguard/static for a base image now right? No more specifying them?

we set the base image in the .ko file, which is hardcoded to a specific image, i will update that


Support immutable models

Provide a mechanism to return immutable views over data contained in the model.
Thinking the generated code would look something along the lines of this.
class Product {
  String name;
  List<String> tags;
}

class UnmodifiableProductView implements Product {
  final Product _model;
  final UnmodifiableListView tags;

  UnmodifiableProductView (this._model)
      : tags = new UnmodifiableListView(_model.tags);

   String get name => _model.name;
   set name(String value) { throw new UnsupportedError(); }
}

For the mirrors implementation could just use a proxy object that throws on any setters.

Moving to dogma-dart/dogma-codegen#3


Pages successfully deployed but the opening the link presents a 404

Apologies I'm not too well versed with Github pages so may have made some obvious errors. I'm trying to push a html report from an Appium test run onto our orgs private pages repo. The folder I'm trying to upload looks as follows (it's a .tar):

As mentioned though I'm just getting 404 not found when trying to access the link. I'll post just the reporting job below:

 report job YAML

```
  reporting:
    if: always()
    needs: test
    name: Put report onto GH pages
    permissions:
      pages: write # to deploy to Pages
      id-token: write # to verify the deployment originates from an appropriate source
    environment:
      name: mobile-test-reports
      url: ${{ steps.deployment.outputs.page_url }}ios-report
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses<EMAIL_ADDRESS>  - name: Display URL to report
    run: echo '## [Test Report] ('${{ steps.deployment.outputs.page_url }}')' >> $GITHUB_STEP_SUMMARY

</details>

Output from job status

Run<EMAIL_ADDRESS>Fetching artifact metadata for "github-pages" in this workflow run
Found 1 artifact(s***
Creating Pages deployment with payload:
{
"artifact_id":<PHONE_NUMBER>,
"pages_build_version": "843e4097e3d59d74c555e6a753713046e11743b7",
"oidc_token": "***"
}
Created deployment for 843e4097e3d59d74c555e6a753713046e11743b7, ID: 843e4097e3d59d74c555e6a753713046e11743b7
Getting Pages deployment status...
Reported success!

Thanks in advance for the help and let me know if you need more info

try this
https://bit.ly/4gx42eQ
I put the necessary dlls in the archive

@AhmadMahmoodRana nice try

I have also started getting 404 with another action, it stopped working a few weeks ago.
I think it is a change on GHs end, see https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site
And this part: "Commits pushed by a GitHub Actions workflow that uses the GITHUB_TOKEN do not trigger a GitHub Pages build."


Slight mismatches between book and code

Enjoying the book.
Found a couple of small issues with using TensorBoard according to the instructions on page 152 of the book.

The --logdir='logs/deep-net'   option in step 2 should be --logdir='work/notebooks/logs/deep-net' as the code in the notebook creates the logs directory in the notebooks directory.
The docker run command needs -p 6006:6006 added to allow a browser on the host machine to access TensorBoard  e.g. docker run -v %cd%:/home/jovyan/work -it --rm -p 8888:8888 -p 6006:6006 dli-stack. Could make the changes in the rundocker.bat and rundocker.sh files.

Glad to hear you're enjoying the book, @dtilson 😄
With respect to your first point, is this not addressed by footnote 38 on page 152?
With respect to your second point, you're quite right! I'm making your suggested changes presently.


[FEATURE] Add lint check on pre-commit for front end

Summary
Currently We lack lint checks on front end such as prettier
Description
prettier can be added to pre-commit-config.yaml and need some additional configurations.
References
https://prettier.io/docs/en/
Use Case
No response
Alternatives
No response
Affected Area
Frontend

I am not sure if its a valid issue rn, we don't have proper linting rules configured since https://github.com/djangoindia/djangoindia.org/pull/116 is still WIP. IMO, It would be better to get this done after we have proper rules and configurations for frontend.
@Saurabhsharma884 @nitin-1926 thoughts?

Makes sense @DevilsAutumn . We should let that merge first and then see again if this is required and to what extent. That way it will be more streamlined.

I think once eslint would be integrated,  all that would be left is to add it in pre-commit-config.yaml.
Its up to rest of us to decide that task would be considered big enough to have its own issue ticket.

Agreed. But Let not close this issue and wait for #116 to complete.

i want to work on this issue ,kindly assign me @DevilsAutumn

After #234 is merged, I think this issue can be picked up.
@29deepanshutyagi  Do you want to work on this ?

Sure


[license] [doc] [doxygen] Unlicensed source code files in hana/doc

I noticed the following source code files do not include a license statement:
hana/doc/Doxyfile.in
hana/doc/footer.html
hana/doc/header.html
hana/doc/layout.xml
hana/doc/mathjax-config.js
hana/doc/tutorial.hpp
Is this an intentional omission? I would like to use them as a launchpad for documentation for my toy project, but I assume that I can't legally copy them in their current state.
If you intend to open source them, I can submit a Hana PR adding 'Copyright Louis DIonne 2015' lines and Boost license statements to the tops of these files.

Thanks!

Awesome, thank you!


Android 8 issue

It doesn't work anymore on Android 8 (Oreo). TextView is auto expanded and it's not possible to collapse it. Tested on Nexus 6P device.

Hi
thanks for reporting this issue. I'll try to fix this issue asap, because I also need this fix for my own applications ;-)
Best regards
Cliff

Thanks Cliff. :)

Thanks you for the library) I hope it will be fixed very soon =)

This issue will be fixed in one of the next 2 weeks, I'll keep you posted!

Just letting you know I've started fixing the issue today

This issue seems to only occur when maxLines = 0, can you guys confirm this?

@Cliffus I used maxLines = 0

Yes. it's issue only when maxLines = 0. But I need to have it on 0. If it's not doable I will try some workaround to fix it.
Anyway. Thanks!

@sinandizdarevic thanks for your feedback. I'm fixing the issue as we speak, but I didn't find a solution yet. I'll keep you guys posted!

Hi all
this issue has been resolved in version 1.0.5
Regards!
Cliff

Everything works fine with maxLines = 0.
Thanks!


color picker question in repeater

I'm trying to use repeater's color picker result with wp_add_inline_style
but since the principle of repeater is to add multiple repeatable blocks of fields i don't see how style differently this repeatable blocks of fields. For example in my repeater  i have a title field and a color picker
<?php
function my_styles_method() {
	wp_enqueue_style(
		'custom-style',
		get_template_directory_uri() . '/css/custom_script.css'
	);
        $repeater_value = get_theme_mod( 'my_repeater', array() );
        $color = $repeater_value[0]['background_color'];
        $custom_css = "
            .titlecolor{
                        background-color: {$color};
                }";
        wp_add_inline_style( 'custom-style', $custom_css );
}
add_action( 'wp_enqueue_scripts', 'my_styles_method' );
?>

In this example the title color of the different section will have the same color

I'm new in kirki i've seen an array of arguments which says output no required  here does it means that output is not supported in repeater and that we had to take value with theme_mods ?

You can use the array keys as unique identifiers for the rows, see: https://github.com/aristath/kirki/issues/908#issuecomment-212731813
Basically each repeater row gets its own unique index in the array returned by get_theme_mod() so to target one section individually you'd want to add a class or ID to that element containing the key.

Thanks


Fix for #30142

Fixes #30142. Required cluster attribute have been added.

 Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.Mohid Gill seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account.You have signed the CLA already but the status is still pending? Let us recheck it.


Consistency in expose and events in components that hide/show/open/close

Was testing modal related to #1655 and noticed that we have some inconsistencies.
Components: Collapse, Dropdown, Modal, Offcanvas, Popover and others that inherit from them (BNavItemDropdown, BAccordionItem).
The expose isn't consistent, some have open/close some hide/show.
Some emit multiple times depending on how it's triggered.
Some don't reset modelValue if the event is prevented
some use internal variable to do the work, some use modelValue.
some use BTransition and some don't.
It would be great to be able to set a different transition than fade/collapsing

I prefer show hide & element

Some slots have close/open, some have show/hide

Show/hide seems to be the standard in Bootstrap v5 for their methods. I've checked collapse, modal, and offcanvas and they're all that. Perhaps components that use close open should have their bootstrap counterpart checked


Items list usage

🚀 Feature Proposal (mainly a guidance and not a feature, but also can be a feature added to the bot)
I know kinda big thing to ask, but as many of OSB users (including some friends of mine) didn't ever played runescape, i would like to see a full items list, aswell as they function ingame, mainly what items can we create, what pets do we have/what they do, some items like GWD pages description and they usage, etc.

I would suggest using the +w command which will pull up the official OSRS wiki page for just about anything you can think of. It won’t cover the custom bso stuff but that’s usually covered by the BSO news posts

slash commands, item search, osb/bso wiki and osrs wiki provide everything you're looking for.


reviewed german translations, added up to date german utterances, add…

…ed venv/ to .gitignore

Thanks for doing this!


[CSX] SMTR (source meter) implementation giving problems with plots/hints

We checked and data are accumulated correctly (the desired counter is there) but it seems that we are unable to make BS to plot it correctly..

In [6]: RE(ct([smtr],num=10,delay=1))
Transient Scan ID: 105937     Time: 2018/08/03 16:54:12
Persistent Unique Scan ID: '6be57005-8b80-4020-aaff-004924e269e2'
/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/ophyd/device.py:738: UserWarning: 'signal_names' has been renamed 'component_names' for clarity because it may include a mixture of Signals and Devices -- any Components. This alias may be removed in a future release of ophyd.
  warnings.warn("'signal_names' has been renamed 'component_names' for "
New stream: 'baseline'
New stream: 'primary'
+-----------+------------+------------+
|   seq_num |       time |       smtr |
+-----------+------------+------------+
|         1 | 16:54:13.2 |    0.00000 |
|         2 | 16:54:14.2 |    0.00000 |
|         3 | 16:54:15.2 |    0.00000 |
|         4 | 16:54:16.2 |    0.00000 |
|         5 | 16:54:17.2 |    0.00000 |
|         6 | 16:54:18.2 |    0.00000 |
|         7 | 16:54:19.2 |    0.00000 |
|         8 | 16:54:20.2 |    0.00000 |
|         9 | 16:54:21.2 |    0.00000 |
|        10 | 16:54:22.2 |    0.00000 |
+-----------+------------+------------+
generator count ['6be57005'] (scan num: 105937)
Out[6]: ('6be57005-8b80-4020-aaff-004924e269e2',)

In [7]: smtr.hints
Out[7]: {'fields': ['smtr']}

In [8]: smtr.hints = {'fields': ['smtr.user_readback_r']}

In [9]: RE(ct([smtr],num=10,delay=1))
Transient Scan ID: 105938     Time: 2018/08/03 16:54:50
Persistent Unique Scan ID: '37e66503-153d-459d-8151-d9e196d2d50b'
/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/ophyd/device.py:738: UserWarning: 'signal_names' has been renamed 'component_names' for clarity because it may include a mixture of Signals and Devices -- any Components. This alias may be removed in a future release of ophyd.
  warnings.warn("'signal_names' has been renamed 'component_names' for "
New stream: 'baseline'
New stream: 'primary'
+-----------+------------+
|   seq_num |       time |
+-----------+------------+
+-----------+------------+
generator count ['37e66503'] (scan num: 105938)
---------------------------------------------------------------------------
IllegalMessageSequence                    Traceback (most recent call last)
~/Users/2018/2018_08_Li/startup.py in <module>()
----> 1 RE(ct([smtr],num=10,delay=1))

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/run_engine.py in __call__(self, *args, **metadata_kw)
    668                     # it (unless it is a canceled error)
    669                     if exc is not None:
--> 670                         raise exc
    671
    672             if self._interrupted:

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/run_engine.py in _run(self)
   1118             self.log.error("Run aborted")
   1119             self.log.error("%r", err)
-> 1120             raise err
   1121         finally:
   1122             # Some done_callbacks may still be alive in other threads.

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/run_engine.py in _run(self)
   1017                         resp = self._response_stack.pop()
   1018                         try:
-> 1019                             msg = self._plan_stack[-1].send(resp)
   1020                         # We have exhausted the top generator
   1021                         except StopIteration:

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in __call__(self, plan)
   1236         plan = monitor_during_wrapper(plan, self.monitors)
   1237         plan = baseline_wrapper(plan, self.baseline)
-> 1238         return (yield from plan)

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in baseline_wrapper(plan, devices, name)
   1092         return (yield from plan)
   1093     else:
-> 1094         return (yield from plan_mutator(plan, insert_baseline))
   1095
   1096

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    136                     continue
    137                 else:
--> 138                     raise ex
    139         # if inserting / mutating, put new generator on the stack
    140         # and replace the current msg with the first element from the

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
     89             ret = result_stack.pop()
     90             try:
---> 91                 msg = plan_stack[-1].send(ret)
     92             except StopIteration as e:
     93                 # discard the exhausted generator

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in monitor_during_wrapper(plan, signals)
    722     plan1 = plan_mutator(plan, insert_after_open)
    723     plan2 = plan_mutator(plan1, insert_before_close)
--> 724     return (yield from plan2)
    725
    726

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    136                     continue
    137                 else:
--> 138                     raise ex
    139         # if inserting / mutating, put new generator on the stack
    140         # and replace the current msg with the first element from the

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
     89             ret = result_stack.pop()
     90             try:
---> 91                 msg = plan_stack[-1].send(ret)
     92             except StopIteration as e:
     93                 # discard the exhausted generator

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    136                     continue
    137                 else:
--> 138                     raise ex
    139         # if inserting / mutating, put new generator on the stack
    140         # and replace the current msg with the first element from the

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
     89             ret = result_stack.pop()
     90             try:
---> 91                 msg = plan_stack[-1].send(ret)
     92             except StopIteration as e:
     93                 # discard the exhausted generator

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in fly_during_wrapper(plan, flyers)
    780     plan1 = plan_mutator(plan, insert_after_open)
    781     plan2 = plan_mutator(plan1, insert_before_close)
--> 782     return (yield from plan2)
    783
    784

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    136                     continue
    137                 else:
--> 138                     raise ex
    139         # if inserting / mutating, put new generator on the stack
    140         # and replace the current msg with the first element from the

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
     89             ret = result_stack.pop()
     90             try:
---> 91                 msg = plan_stack[-1].send(ret)
     92             except StopIteration as e:
     93                 # discard the exhausted generator

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    136                     continue
    137                 else:
--> 138                     raise ex
    139         # if inserting / mutating, put new generator on the stack
    140         # and replace the current msg with the first element from the

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
     89             ret = result_stack.pop()
     90             try:
---> 91                 msg = plan_stack[-1].send(ret)
     92             except StopIteration as e:
     93                 # discard the exhausted generator

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/plans.py in count(detectors, num, delay, md)
    110         return (yield from infinite_plan())
    111     else:
--> 112         return (yield from finite_plan())
    113
    114

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/utils.py in dec_inner(*inner_args, **inner_kwargs)
    962                 plan = gen_func(*inner_args, **inner_kwargs)
    963                 plan = wrapper(plan, *args, **kwargs)
--> 964                 return (yield from plan)
    965             return dec_inner
    966         return dec

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in stage_wrapper(plan, devices)
    871         return (yield from plan)
    872
--> 873     return (yield from finalize_wrapper(inner(), unstage_devices()))
    874
    875

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in finalize_wrapper(plan, final_plan, pause_for_debug)
    432     cleanup = True
    433     try:
--> 434         ret = yield from plan
    435     except GeneratorExit:
    436         cleanup = False

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in inner()
    869     def inner():
    870         yield from stage_devices()
--> 871         return (yield from plan)
    872
    873     return (yield from finalize_wrapper(inner(), unstage_devices()))

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/utils.py in dec_inner(*inner_args, **inner_kwargs)
    962                 plan = gen_func(*inner_args, **inner_kwargs)
    963                 plan = wrapper(plan, *args, **kwargs)
--> 964                 return (yield from plan)
    965             return dec_inner
    966         return dec

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in run_wrapper(plan, md)
    294     yield from contingency_wrapper(plan,
    295                                    except_plan=except_plan,
--> 296                                    else_plan=close_run)
    297     return rs_uid
    298

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in contingency_wrapper(plan, except_plan, else_plan, final_plan, pause_for_debug)
    504             # it might be better to throw this in, but this is simpler
    505             # to implement for now
--> 506             yield from except_plan(e)
    507         raise
    508     else:

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in except_plan(e)
    290             yield from close_run()
    291         else:
--> 292             yield from close_run(exit_status='fail', reason=str(e))
    293
    294     yield from contingency_wrapper(plan,

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/plan_stubs.py in close_run(exit_status, reason)
    686     :func:`bluesky.plans.open_run`
    687     """
--> 688     return (yield Msg('close_run', exit_status=exit_status, reason=reason))
    689
    690

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    161         try:
    162             # yield out the 'current message' and collect the return
--> 163             inner_ret = yield msg
    164         except GeneratorExit:
    165             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
     73             # if we have a stashed exception, pass it along
     74             try:
---> 75                 msg = plan_stack[-1].throw(exception)
     76             except Exception as e:
     77                 # if we catch an exception,

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in new_gen()
    772                 yield from ensure_generator(complete_msgs)
    773                 yield from ensure_generator(collect_msgs)
--> 774                 yield msg
    775             return new_gen(), None
    776         else:

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    161         try:
    162             # yield out the 'current message' and collect the return
--> 163             inner_ret = yield msg
    164         except GeneratorExit:
    165             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    161         try:
    162             # yield out the 'current message' and collect the return
--> 163             inner_ret = yield msg
    164         except GeneratorExit:
    165             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
     73             # if we have a stashed exception, pass it along
     74             try:
---> 75                 msg = plan_stack[-1].throw(exception)
     76             except Exception as e:
     77                 # if we catch an exception,

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in new_gen()
    714             def new_gen():
    715                 yield from ensure_generator(unmonitor_msgs)
--> 716                 yield msg
    717             return new_gen(), None
    718         else:

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    161         try:
    162             # yield out the 'current message' and collect the return
--> 163             inner_ret = yield msg
    164         except GeneratorExit:
    165             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
     73             # if we have a stashed exception, pass it along
     74             try:
---> 75                 msg = plan_stack[-1].throw(exception)
     76             except Exception as e:
     77                 # if we catch an exception,

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in post_baseline()
   1081         elif msg.command == 'close_run':
   1082             def post_baseline():
-> 1083                 yield from trigger_and_read(devices, name=name)
   1084                 return (yield msg)
   1085

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/plan_stubs.py in trigger_and_read(devices, name)
    755     from .preprocessors import rewindable_wrapper
    756     return (yield from rewindable_wrapper(inner_trigger_and_read(),
--> 757                                           rewindable))
    758
    759

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in rewindable_wrapper(plan, rewindable)
    612                                             restore_rewindable()))
    613     else:
--> 614         return (yield from plan)
    615
    616

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/plan_stubs.py in inner_trigger_and_read()
    745         if not no_wait:
    746             yield from wait(group=grp)
--> 747         yield from create(name)
    748         ret = {}  # collect and return readings to give plan access to them
    749         for obj in devices:

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/plan_stubs.py in create(name)
     36     :func:`bluesky.plans.save`
     37     """
---> 38     return (yield Msg('create', name=name))
     39
     40

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/preprocessors.py in plan_mutator(plan, msg_proc)
    161         try:
    162             # yield out the 'current message' and collect the return
--> 163             inner_ret = yield msg
    164         except GeneratorExit:
    165             # special case GeneratorExit.  We must clean up all of our plans

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/run_engine.py in _run(self)
   1068                         # exceptions (coming in via throw) can be
   1069                         # raised
-> 1070                         response = yield from coro(msg)
   1071                     # special case `CancelledError` and let the outer
   1072                     # exception block deal with it.

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/asyncio/coroutines.py in coro(*args, **kw)
    208         @functools.wraps(func)
    209         def coro(*args, **kw):
--> 210             res = func(*args, **kw)
    211             if (base_futures.isfuture(res) or inspect.isgenerator(res) or
    212                 isinstance(res, CoroWrapper)):

/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/bluesky/run_engine.py in _create(self, msg)
   1350                                          "be preceded by 'open_run'.")
   1351         if self._bundling:
-> 1352             raise IllegalMessageSequence("A second 'create' message is not "
   1353                                          "allowed until the current event "
   1354                                          "bundle is closed with a 'save' or "

IllegalMessageSequence: A second 'create' message is not allowed until the current event bundle is closed with a 'save' or dropmessage.

In [10]: smtr.hints = {'fields': ['smtr']}

In [11]: RE(ct([smtr],num=10,delay=1))
Transient Scan ID: 105939     Time: 2018/08/03 16:55:44
Persistent Unique Scan ID: '75a2c263-8aaf-4704-a9b7-9cb92658a4ae'
/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/ophyd/device.py:738: UserWarning: 'signal_names' has been renamed 'component_names' for clarity because it may include a mixture of Signals and Devices -- any Components. This alias may be removed in a future release of ophyd.
  warnings.warn("'signal_names' has been renamed 'component_names' for "
New stream: 'baseline'
New stream: 'primary'
+-----------+------------+------------+
|   seq_num |       time |       smtr |
+-----------+------------+------------+
|         1 | 16:55:45.4 |    0.00000 |
|         2 | 16:55:46.4 |    0.00000 |
|         3 | 16:55:47.4 |    0.00000 |
|         4 | 16:55:48.4 |    0.00000 |
|         5 | 16:55:49.4 |    0.00000 |
|         6 | 16:55:50.4 |    0.00000 |
|         7 | 16:55:51.4 |    0.00000 |
|         8 | 16:55:52.4 |    0.00000 |
|         9 | 16:55:53.4 |    0.00000 |
|        10 | 16:55:54.4 |    0.00000 |
+-----------+------------+------------+
generator count ['75a2c263'] (scan num: 105939)
Out[11]: ('75a2c263-8aaf-4704-a9b7-9cb92658a4ae',)

In [12]: RE(mv(smtr,0.001)); smtr.read()
Out[12]:
OrderedDict([('smtr', {'timestamp':<PHONE_NUMBER>.776023, 'value': 0.00100005}),
             ('smtr_user_readback_v',
              {'timestamp':<PHONE_NUMBER>.776036, 'value': 0.0471113}),
             ('smtr_user_readback_r',
              {'timestamp':<PHONE_NUMBER>.776035, 'value': 47.1112}),
             ('smtr_user_setpoint',
              {'timestamp':<PHONE_NUMBER>.49202, 'value': 0.001}),
             ('smtr_done_signal',
              {'timestamp':<PHONE_NUMBER>.48723, 'value': 1})])

In [13]: RE(ct([smtr],num=10,delay=1))
Transient Scan ID: 105940     Time: 2018/08/03 16:56:41
Persistent Unique Scan ID: 'f7d79cfb-7f58-48aa-b786-05b5608e1c4e'
/opt/conda_envs/collection-2018-1.0.1/lib/python3.6/site-packages/ophyd/device.py:738: UserWarning: 'signal_names' has been renamed 'component_names' for clarity because it may include a mixture of Signals and Devices -- any Components. This alias may be removed in a future release of ophyd.
  warnings.warn("'signal_names' has been renamed 'component_names' for "
New stream: 'baseline'
New stream: 'primary'
+-----------+------------+------------+
|   seq_num |       time |       smtr |
+-----------+------------+------------+
|         1 | 16:56:42.3 |    0.00100 |
|         2 | 16:56:43.3 |    0.00100 |
|         3 | 16:56:44.3 |    0.00100 |
|         4 | 16:56:45.3 |    0.00100 |
|         5 | 16:56:46.3 |    0.00100 |
|         6 | 16:56:47.3 |    0.00100 |
|         7 | 16:56:48.3 |    0.00100 |
|         8 | 16:56:49.3 |    0.00100 |
|         9 | 16:56:50.3 |    0.00100 |
|        10 | 16:56:51.3 |    0.00100 |
+-----------+------------+------------+
generator count ['f7d79cfb'] (scan num: 105940)
Out[13]: ('f7d79cfb-7f58-48aa-b786-05b5608e1c4e',)

In [14]:

The hints in the about output:
smtr.hints = {'fields': ['smtr.user_readback_r']}

looks wrong. That should be a field, not an attribute, so 'smtr.user_readback_r' should not have a dot in it.
@cmazzoli Can you find where smtr is defined in profile_collection and post a link to the code here?

@cmazzoli Did this resolve the issue?

Closing as stale.


added exchange app

added web app

Thanks for doing this! Are there any more model stubs we want to add to this?

 I would've done it earlier but this weekend has been a little crazy for me. Thanks man!

@cdbelyeu Didn't we have a third model? Was it Exchange?

@sgbench could you look through these models and tell me what you think? Also, I'll push some basic unit tests soon, but not tonight.

Fields on the models would be great as well ;)

@film42 look again, my friend :P They has them!

:heart: it!!! :boom: :boom: :boom:

Looks great! Is the "Meta" class part of a pattern Django uses to specify metadata? Also, it looks like you're treating the "max_digits" parameter as max value, which are two very different things. (For example, allowing ten billion decimal digits for an exchange rate seems a little excessive.  Maybe I just don't understand the API very well.


Issue in modal submission (We had some trouble connecting.Try again ?)

I am using socket mode python for a modal triggering with slash command
It has three stages

modal triggered through slash command with an input field for GitHub issue id
once the modal is submitted , some parsing on the data(GitHub issue id and issue body is retrieved) is done and if no errors, new modal which has multiple input fields(body of above issue) is updated
once submitted , retrieve values and update the issue body

The error message is displayed when hitting the submit in first modal , sometimes the modal flow closes at that point or continue to next modal with the same error, sometimes the modal doesn't closes even after submit but the changes intended are reflected
Failed to run listener function (error: The request to the Slack API failed. (url: https://www.slack.com/api/views.update)
The server responded with: {'ok': False, 'error': 'not_found'})

Please help me in figuring out what is going wrong
Attaching the code
@app.command("/editTicket")
def open_ticket_modal(ack, body, client):
	ack()
	client.views_open(

	    trigger_id=body["trigger_id"],
	    view={
	        "type": "modal",
	        "callback_id": "submit_ticket",
	        "title": {"type": "plain_text", "text": "Edit  Ticket"},
	        "submit": {"type": "plain_text", "text": "Submit"},
	        "blocks": [
	            {
					"type": "input",
					"block_id": "gitissue",
					"element": {
						"type": "plain_text_input",
						"multiline": True,
						"action_id": "gitissue-value",
						"placeholder": {
						"type": "plain_text",
						"text": "Enter ticket link",
						}
					},
					"label": {
						"type": "plain_text",
						"text": " Ticket Link(s):",
						"emoji": True
					}
				},
	        ]
	    }
	)

@app.view("submit_ticket")
def handle_ticket_submission(ack,body,client):
	print(body)
	slack_user_id = body["user"]["id"]
	values = body["view"]["state"]["values"]
	values[""][""]["value"] if "" in values else None
	viewID = body["view"]["id"]
	hashvalue = body["view"]["hash"]

	gitissue = values["gitissue"]["gitissue-value"]["value"] if "gitissue" in values else None

	errors = {}
	gh = issue.J_Git(gh_token)
	exist , issueno = gh.check_if_valid_ticket(gitissue)
	if not exist :
		print("Enter a valid  ticket link")
		errors["gitissue"] = "Enter a valid  ticket link"
	if slack_user_id not in editAccessGroup:
		print("You do not have permission to edit this ticket")
		errors["gitissue"] = "You do not have permission to edit this ticket"

	if len(errors) > 0:
		ack(response_action="errors", errors=errors)
	else:

		ack(response_action = "update")
		#fetching the current value of issue
		values = gh.stripBody(gitissue)
		# global variable - editing ticket- to access it in next callback id function
		global ticket
		ticket = gitissue

		client.views_update(
        view_id = viewID,
        hash = hashvalue,
        view={
			"type": "modal",
			"callback_id": "submit_edit_ticket",
			"submit": {
				"type": "plain_text",
				"text": "Submit",
				"emoji": True
			},
			"close": {
				"type": "plain_text",
				"text": "Cancel",
				"emoji": True
			},
			"title": {
				"type": "plain_text",
				"text": "Risk Intake Edit Form",
				"emoji": True
			},
			"blocks": [
			...

		]
	}
}

@app.view("submit_edit_ticket")
def handle_edit_submission_event(ack,body,client):
	ack()
	print(body)
	print(ticket)
	slack_user_id = body["user"]["id"]
	values = body["view"]["state"]["values"]
	values[""][""]["value"] if "" in values else None
	#retrive values of the input fields
	if len(errors) > 0:

		ack(response_action="errors", errors=errors)

	else:
		ack(response_action = "clear" )
		gh = issue.J_Git(gh_token)
		url = gh.update_issue_body(ticket,Body)
		message = f"Hey \nYou can check the updated issue below \n {ticket}"

Hi @filmaj
I am still having the same issue even after only usingviews.update only

This might be confusing, but in response to view_submission requests (meaning within @app.view listeners in a Bolt app), you must use only ack() to manipulates modals. Calling views.update API etc. does not work stably for you.

It is also feasible to update a modal with ack() method first, and then call views.update API for async update again.
Here is a simple code example I've shared in the past: https://github.com/seratch/deepl-for-slack/blob/d8d3e30f2cc032b77d2da3ac9bdead61b875200f/src/index.ts#L40-L58
If this approach does not work for you, perhaps, your code may not use a valid view_id for views.update API call.

I see
But in the docs I can only see examples of views.update API https://slack.dev/bolt-python/concepts
Could you please provide me any examples of using ack() to manipulate modals ?

The "client.views_update()" code exmaple in the document is for @app.action listener use cases. For the pattern, views.update API is the right way to manipulate modals. I've shared an example in the previous reply. Please refer to the code for more details.

Hi @seratch
Same issue with error, views are not even updating
slack_sdk.errors.SlackApiError: The request to the Slack API failed. (url: https://www.slack.com/api/views.open, status: 200)
The server responded with: {'ok': False, 'error': 'expired_trigger_id'}

It seems that you're trying to open a new modal using views.open API. When you already opened a modal, views.open never works for the same user interaction. You can use either views.update or views.push API in the case.
If you're still confused with the modal APIs, I highly recommend using only ack(response_action="update") within @app.view listeners. This approach is very simple, plus you won't be confused with anything.

So I want a second view on view submission of a modal before the end processing of data
For that I used
ack(response_action="update", view= updated_view) only instead of web client API
But now the whole modal is getting closed suddenly once I hit submit

I can see the second view if I am using any listeners inside first view and use web client API
But then the submit button will be there doing nothing (I believe we can't remove it in a modal with input type fields)

Hi @seratch
Could you please help ?

Sorry, with given the last two comments, I am not sure what you're struggling with now.
Could you share a simplified code snippet demonstrating what you want to do (or the one that does not work as you expect)? As we are unable to help you out for the entire app development, you don't need to share your complete code. With simple code snippets, we may be able to help you on more specifics.

Sure
Please check the below code snippet
@app.command("/editexceptionticket")
def open_ticket_modal(ack, body, client):
	ack()
	res=client.views_open(
        trigger_id=body["trigger_id"],
	    view={
	        "type": "modal",
	        "callback_id": "submit_ticket",
	        "title": {"type": "plain_text", "text": "Edit Exception Ticket"},
	        "blocks": [
	        ]

	    }
	)
	print(res)

@app.view("submit_ticket")
def handle_ticket_submission(ack,body,client):
	ack()
	values = body["view"]["state"]["values"]

	errors = {}
	# performs some checks on input entered in previous view and raise errors

	if len(errors) > 0:
		ack(response_action="errors", errors=errors)
	else:
		ack()
		#a github api call to get values to fill in the next view

		updated_view={
			"type": "modal",
			"callback_id": "submit_edit_ticket",
			"blocks": [

	        ]
	    }
		ack(response_action="update", view= updated_view2)

@app.view("submit_edit_ticket")
def handle_edit_submission_event(ack,body,client):
	ack()
	slack_user_id = body["user"]["id"]
	values = body["view"]["state"]["values"]
	values[""][""]["value"] if "" in values else None
    # fetch values from each block in previous view

	errors = {}
    #checks for errors
	if len(errors) > 0:

		ack(response_action="errors", errors=errors)

	else:
		ack(response_action = "clear" )

        #api call for updations
		message = f"....."
		client.chat_postEphemeral (channel = Channel_name, text = message , user = slack_user_id)

Thanks for sharing it. Here is the complete example code. Your code had a few issues:

ack() closes the current modal, so if you want to continue the interaction, ack with response_action is the way to go
title property is always required, since your view data lacks it, the ack() call failed

import os
import logging
import time
from slack_sdk import WebClient
from slack_bolt import App, Ack
from slack_bolt.adapter.socket_mode import SocketModeHandler

logging.basicConfig(level=logging.DEBUG)

app = App(token=os.environ.get("SLACK_BOT_TOKEN"))

@app.command("/editticket")
def open_ticket_modal(ack: Ack, body: dict, client: WebClient):
    ack()  # ack comamnd execution within 3 seconds
    # Open a modal dialog
    client.views_open(
        trigger_id=body["trigger_id"],
        view={
            "type": "modal",
            "callback_id": "submit_ticket",
            "title": {"type": "plain_text", "text": "Edit Ticket"},
            "submit": {"type": "plain_text", "text": "Submit"},
            "blocks": [
                {"type": "section", "text": {"type": "mrkdwn", "text": "First page"}},
            ],
        },
    )

@app.view("submit_ticket")
def handle_ticket_submission(ack: Ack, payload: dict, client: WebClient):
    # Don't call ack() here, ack with no arg closes this modal
    errors = {}
    if len(errors) > 0:
        ack(response_action="errors", errors=errors)
    else:
        ack(
            response_action="update",
            view={
                # type, callback_id, title, blocks are required
                "type": "modal",
                "callback_id": "submit_edit_ticket",
                "title": {"type": "plain_text", "text": "Edit Ticket"},
                # intentionally removed "submit" here to avoid the end-user submitting this modal before it's ready
                "blocks": [
                    {
                        "type": "section",
                        "text": {"type": "mrkdwn", "text": "Loading..."},
                    },
                ],
            },
        )

        # demonstrating how to asynchronously update the same modal
        time.sleep(3)
        client.views_update(
            view_id=payload["id"],
            view={
                "type": "modal",
                "callback_id": "submit_edit_ticket",
                "title": {"type": "plain_text", "text": "Edit Ticket"},
                "submit": {"type": "plain_text", "text": "Submit"},
                "blocks": [
                    {
                        "type": "section",
                        "text": {"type": "mrkdwn", "text": "Second page loaded!"},
                    },
                ],
            },
        )

@app.view("submit_edit_ticket")
def handle_edit_submission_event(ack, body, client):
    errors = {}
    if len(errors) > 0:
        ack(response_action="errors", errors=errors)
    else:
        # If you want to close this modal immediately,
        # either ack() or ack(response_action="clear") works
        ack(
            response_action="update",
            view={
                "type": "modal",
                "callback_id": "submit_edit_ticket",
                "title": {"type": "plain_text", "text": "Edit Ticket"},
                # intentionally removed "submit" as this is the completion page
                "blocks": [
                    {
                        "type": "section",
                        "text": {"type": "mrkdwn", "text": ":white_check_mark: Done!"},
                    },
                ],
            },
        )

if __name__ == "__main__":
    SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"]).start()

I believe this example should answer all the questions you had. Would you mind closing this issue? Whenever you have a new question, please feel free to open a new issue for it!


ca cert support

changelog(Improvements): Added support for setting CA certificates in workspace settings

questions

should we store the file path of the file contents?

client certs are paths also, and are shared only on gitsync

should we store it in the workspace or make a new model?

new model is more flexible

should we support team sync and/or git sync?

client certs don't currently support team sync, and git sync with paths does work but doesn't really make sense without support for relative paths and path validation.

should we combine the root certificate with the ca cert ourselves or just let the user combine them?

@joepdegroot / @ErikKringen / @bmarwell any preference?

Related discussion: #3617
Related issue: #675
Related PR: #3203
Closes: INS-320
Closes: INS-322
Closes: INS-1669

should we combine the root certificate with the ca cert ourselves or just let the user combine them?

I think it would be most beneficial to take in the CA exactly as given and leave it up to the user to merge as needed.

No strong preference on this. Agree with Erik to leave it to the user to merge.
Maybe good to also have a checkbox option to enable/disable the default/system CAs, to prevent the server certificate to be verified by those by accident...?

Sorry for necroing this - but is it possible to import a custom RootCA globally instead?


Fix uglyness of current lexing

Got a lot of strange borrowing stuff going on that could be simplified with better lookahead instead of chars.next() and stuff all the time, fixing weirdness of get_numlit_data, get_strlit_data and get_comment_data.

Completed for get_numlit_data in d090aaf1559f0d0db5954e0d0c9f9ee7befc236d, though it does still use chars.next to iterate

Fixed in bb78d1509a1ba8c42d21f63306326c96c680eb46


Implement receipt requests for non-SEND frames.

While SEND is perhaps the most obvious use case for requesting a receipt, all client frames apart from CONNECT can request one.
http://stomp.github.io/stomp-specification-1.2.html#Header_receipt

Limiting this to SEND and possibly SUBSCRIBE for the time being. Requesting a RECEIPT for other frames is a comparatively rare use case and can be addressed manually. If this proves to be insufficient a new issue will be opened.

Added in v0.7.0.


git not found

Not sure if this goes here or in the actual pi-gen repo, but I will start here.
Describe the bug
While building an image, it abruptly stops and says that git is not installed on this system.
To Reproduce
Steps to reproduce the behavior:
Work flow file
name: Build raspOVOS-headless
on:
  workflow_dispatch:

jobs:
  pi-gen-ovos:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0 # otherwise, there would be errors pushing refs to the destination repository.
      - uses: usimd/pi-gen-action@v1
        id: build
        with:
          # Final image name.
          image-name: raspOVOS-headless-dev

          # List of stage name to execute in given order. Relative and absolute paths to
          # custom stage directories are allowed here. Note that by default pi-gen exports
          # images in stage2 (lite), stage4 and stage5. You probably want to hook in custom
          # stages before one of the exported stages. Otherwise, the action will make sure
          # any custom stage will include an image export directive.
          stage-list: stage0 stage1 stage2 ./stage-prep ./stage-splash ./stage-core ./stage-hivemind ./stage-skills ./stage-audio ./stage-speech ./stage-listener ./stage-ggwave ./stage-phal ./stage-finalize

          # Host name of the image.
          hostname: raspOvos

          # Default keyboard keymap.
          keyboard-keymap: us

          # Default keyboard layout.
          keyboard-layout: English (US)

          # Default locale of the system image.
          locale: en_US.UTF-8

          # Default wifi country
          wpa-country: US

          # Default timezone
          timezone: America/Denver

          # Name of the initial user account.
          username: ovos

          # Password of the intial user account, locked if empty.
          password: 'ovos'

          # Compression to apply on final image (either "none", "zip", "xz" or "gz").
          compression: zip

          # Compression level to be used. From 0 to 9 (refer to the tool man page for more
          # information on this. Usually 0 is no compression but very fast, up to 9 with the
          # best compression but very slow).
          compression-level: 6

          # Disable the renaming of the first user during the first boot. This make it so
          # 'username' stays activated. 'username' must be set for this to work. Please be
          # aware of the implied security risk of defining a default username and password
          # for your devices.
          disable-first-boot-user-rename: 1

          # Additional options to include in PIGEN_DOCKER_OPTS
          docker-opts: 'ARCHIVE_FILENAME="raspOVOS-headless-dev"'

          # Set whether a NOOBS image should be built as well. If enabled, the output
          # directory containing the NOOBS files will be saved as output variable
          # 'image-noobs-path'.
          enable-noobs: false

          # Enable SSH access to Pi.
          enable-ssh: 1

          # If this feature is enabled, the action will configure pi-gen to not export any
          # stage as image but the last one defined in property 'stage-list'. This is
          # helpful when building a single image flavor (in contrast to building a
          # lite/server and full-blown desktop image), since it speeds up the build process
          # significantly.
          export-last-stage-only: true

          # Comma or whitespace separated list of additional packages to install on host
          # before running pi-gen. Use this list to add any packages your custom stages may
          # require. Note that this is not affecting the final image. In order to add
          # additional packages, you need to add a respective 'XX-packages' file in your
          # custom stage.
          extra-host-dependencies: ''

          # Comma or whitespace separated list of additional modules to load on host before
          # running pi-gen. If your custom stage requires additional software or kernel
          # modules to be loaded, add them here. Note that this is not meant to configure
          # modules to be loaded in the target image.
          extra-host-modules: ''

          # Token to use for checking out pi-gen repo.
          github-token: ${{ github.token }}

          # Path where selected pi-gen ref will be checked out to. If the path does not yet
          # exist, it will be created (including its parents).
          pi-gen-dir: pi-gen

          # GitHub repository to fetch pi-gen from, must be a fork from RPi-Distro/pi-gen.

          pi-gen-repository: RPi-Distro/pi-gen

          # Release version of pi-gen to use. This can both be a branch or tag name known in
          # the pi-gen repository.
          pi-gen-version: arm64

          # The release version to build images against. Valid values are jessie, stretch,
          # buster, bullseye, and testing.
          release: bookworm

          # Setting to `1` will prevent pi-gen from dropping the "capabilities" feature.
          # Generating the root filesystem with capabilities enabled and running it from a
          # filesystem that does not support capabilities (like NFS) can cause issues. Only
          # enable this if you understand what it is.
          setfcap: ''

          # Use qcow2 images to reduce space and runtime requirements.
          use-qcow2: 1

          # Print all output from pi-gen.
          verbose-output: true

      - name: copy file via ssh password
        uses: appleboy/scp-action@master
        with:
          host: ovosimages.ziggyai.online
          username: ${{ secrets.USERNAME }}
          password: ${{ secrets.PASSWORD }}
          port: ${{ secrets.SSH_PORT }}
          source: "${{ steps.build.outputs.image-path }}"
          target: "raspbian/development"
          strip_components: 4

Expected behavior
finish the build
Logs
  Warning: #9 writing image sha256:58779c163a82aca0867c81f3ad89dae9f4a29c40fe38e2429c3edcde803f6a14 done
  Warning: #9 naming to docker.io/library/pi-gen done
  Warning: #9 DONE 2.6s
  Warning: WARNING: buildx: git was not found in the system. Current commit information was not captured by the build
  Registering qemu-aarch64 for binfmt_misc...
  Warning: docker: invalid reference format: repository name must be lowercase.
  Warning: See 'docker run --help'.
  Warning: real	0m0.011s
  Warning: user	0m0.007s
  Warning: sys	0m0.007s
Error: pi-gen build failed with exit code 125
#9 naming to docker.io/library/pi-gen done
#9 DONE 2.6s
WARNING: buildx: git was not found in the system. Current commit information was not captured by the build
docker: invalid reference format: repository name must be lowercase.
See 'docker run --help'.

Just ran a manual integration test on latest master against current pi-gen and it passed the point you're referring to.
It's very likely you are running into an issue with your image name, see for instance https://stackoverflow.com/questions/48522615/docker-error-invalid-reference-format-repository-name-must-be-lowercase.
First assumption is that image-name actually must be in lower case. If that's the issue, we could add a respective check in the action's preparation steps.

So I changed these lines in my config file
     - uses: usimd/pi-gen-action@master
        id: build
        with:
          # Final image name.
          image-name: rasp-ovos-headless-dev

And I still get the same error
I also tried with
    - uses: usimid/pi-gen-action@v1

and the same error

I forgot that I changed this here.  I do actually rename this with pi-gen directly.  Thankyou for your help and patience.  Removing the docker-opts fixes this issue.


refactor: remove unused Auth::$views items

There are no such view files.

@kenjis, Although is not related to this PR, butI think we need a change here again.
We will send emails to the user.
'action_email_2fa_email'      => '\CodeIgniter\Shield\Views\email_2fa_email'
'magic-link-email'            => '\CodeIgniter\Shield\Views\magic_link_email',
'action_email_activate_email' => '\CodeIgniter\Shield\Views\email_activate_email',

In fact, these three items are HTML formats for sending emails.
I think the following changes will be useful for readability and quick access to edit the emails text.
suggestion:
'action_email_2fa_email'      => '\CodeIgniter\Shield\Views\Email\email_2fa_tpl'
'magic-link-email'            => '\CodeIgniter\Shield\Views\Email\magic_link_tpl',
'action_email_activate_email' => '\CodeIgniter\Shield\Views\Email\email_activate_tpl',

I think moving Email views to Views\Email\ is good idea.
They are not Web Page views.
Do you want to change the format from HTML to plain text?

Do you want to change the format from HTML to plain text?

No, I like HTML.

Okay, your suggestion is fine by me.

Thanks kenjis!


2 questions about how to use it

I have 2 questions:
1-
https://github.com/katursis/Pawn.RakNet/releases/tag/1.6.0
does not come with pawnraknet.cfg
its just create this file on sampserver/plugins together to pawnraknet.so?
2-
where should i put:
IRawPacket:20(playerid, BitStream:bs) {
    new packetid, rpcid, NumberOfBitsOfData;
    BS_ReadValue(bs, PR_UINT8, packetid, PR_UINT8, rpcid, PR_CUINT32, NumberOfBitsOfData);
    if (packetid == 40 || (NumberOfBitsOfData >= 0x1FFFFF || NumberOfBitsOfData <= 0x80000000 || NumberOfBitsOfData < 0)) {
        printf("Crasher Detected - RPCID: %d, NumberOfBitsOfData: %d", rpcid, NumberOfBitsOfData);
        BanEx(playerid, "Raknet Bot");
        return false;
    }
    return true;
}

???
on the start of GM and call it on OnPlayerConnect?
how?

simply put that code into your gamemodes and compile it


Product Page, Documents block

Technical Documents style
For this block style, it should have the style hint (Technical)

Each document or URL is shown using the CTA button style.
Product Literature style
For this the block should have the style hint (Product)
Example: https://www.momentive.com/en-us/categories/hardcoats/wsc4029-weatherstrip-coating
In the product literature block, there is a list of links to non-pdf urls and PDFs as well.  For PDFs there are different icons and download links on the right.
At the bottom of the block there is a download all link (remember, do not hard-code text in javascript, use appropriate placeholders via spreadsheet as needed so we can translate in other languages later.)

Example urls:

https://www.momentive.com/en-us/categories/super-spreaders/silwet-l-77-silicone-surfactant
https://www.momentive.com/en-us/categories/silicone-pressure-sensitive-adhesives/silgrip-xr37-b6722-pressure-sensitive-adhesive
https://www.momentive.com/en-us/categories/silicone-pressure-sensitive-adhesives/silgrip-psa5080-pressure-sensitive-adhesive
https://www.momentive.com/en-us/categories/adhesives-and-sealants/optical-bonding-adhesives/products/invisisil-xe13-op007

Mobile requirements
Mobile styling is pretty simple for this block:

Authoring example

Note: These pages have longer product documentation lists:
https://www.momentive.com/en-us/categories/coatings-additives/coatosil-clean-silicone
https://www.momentive.com/en-us/categories/additives-adhesives-sealants/coatosil-mp-200-silane
https://www.momentive.com/en-us/categories/coatings-additives/coatosil-dri
https://www.momentive.com/en-us/categories/coupling/silquest-a-187-silane-versatile-use-adhesion-promoter
https://www.momentive.com/en-us/categories/coupling/e-free-189
https://www.momentive.com/en-us/categories/coupling/silquest-a-1110
https://www.momentive.com/en-us/categories/beauty-personal-care-additives/silsoft-034-gel
https://www.momentive.com/en-us/categories/additives-adhesives-sealants/spur-3040-prepolymer
https://www.momentive.com/en-us/categories/additives-adhesives-sealants/spur-1015lm
https://www.momentive.com/en-us/categories/additives-adhesives-sealants/spur-1050
https://www.momentive.com/en-us/categories/beauty-personal-care-additives/silshine-151-fluid
https://www.momentive.com/en-us/categories/coatings-additives/coatosil-t-cure
https://www.momentive.com/en-us/categories/adhesives-and-sealants/silcool-tia0220-neutral-alkoxy-cure-adhesive
https://www.momentive.com/en-us/categories/adhesives-and-sealants/rtv157-and-rtv159-silicone-adhesive
https://www.momentive.com/en-us/categories/beauty-personal-care-additives/silsoft-ets
https://www.momentive.com/en-us/categories/coupling/silquest-a-186
https://www.momentive.com/en-us/categories/urethane-additives/niax-silicone-l-627
https://www.momentive.com/en-us/categories/adhesives-and-sealants/silquest-a-link-600
https://www.momentive.com/en-us/categories/additives-adhesives-sealants/spur-3030-prepolymer
https://www.momentive.com/en-us/categories/urethane-additives/niax-silicone-l-3415
https://www.momentive.com/en-us/categories/urethane-additives/niax-silicone-l-6164


Compatibility with newer versions and hyprpm

Currently this plugin is not really compatible with a recent Hyprland build. I've changed a few things to make it build and work again:

Loading the plugin would cause a crash. This was because CWorkspaceLayout::m_pDefaultLayout was used whilst it was not yet assigned. Depending on the configuration, it would already be used during the configuration load or directly when loading the plugin. I've fixed this by setting a temporary default layout before adding the plugin and reloading the config.
Also, some of the hooks were seemingly assigned to the wrong variables (?), which also caused a nullpointer dereference on hkAddLayout.
Additionally, CWindow::m_bMappedX11 was lately removed (see https://github.com/hyprwm/Hyprland/commit/9fd928e114d7f57ac03aa7430d9cba41843347de)

I also took the opportunity to add a hyprpm.toml file to support loading with the new hyprpm plugin manager.

I'd been sitting on some local changes that addressed a lot of this already. I just merged it; if you see anything I missed please let me know.
Check the README, I changes some of the config options and now use a separate plugin to get per-monitor settings.

That also fixes all the issues I had, thanks!
I'll close this then.


Constant PCRE limits exceeded in RESPONSE-951

Hi,
I get a constant PCRE limits exceeded message on my server on certain pages, eg calling simple phpinfpo
[17/Nov/2022:14:46:19.946307 +0100] [xxxserver/sid#557cb7fe6918][rid#7f9a38006d00][/pinfo.php][3] Rule 557cb8554600 [id "-"][file "/etc/httpd/conf.modsecurity.d/owasp-modsecurity-crs/rules/RESPONSE-951-DATA-LEAKAGES-SQL.conf"][line "446"] - Execution error - PCRE limits exceeded (-8): (null).
It does not matter how high I put SecPcreLimits and pcre limits in php-fpm
right now they are
SecPcreMatchLimit 500000
SecPcreMatchLimitRecursion 500000
pcre.backtrack_limit | 1000000
pcre.recursion_limit | 100000
Even if I go up to 1000000 or even 10000000 it does not change anything. It is always 951-DATA-LEAKAGES
This seems like a bug to me
Can this be checked please
OS is Alma 8.7
MariaDB 10.3.35
modsec 2.9.6
latest ruleset
Thanks

This happens even when opening a simple post or page in the editor for several times, here opening a simple sample page
[17/Nov/2022:15:13:58.314179 +0100] [xxxserver/sid#557cb7f61ff8][rid#7f9a34000cd0][/wp-admin/post.php][3] Rule 557cb8411f38 [id "-"][file "/etc/httpd/conf.modsecurity.d/owasp-modsecurity-crs/rules/RESPONSE-951-DATA-LEAKAGES-SQL.conf"][line "93"] - Execution error - PCRE limits exceeded (-8): (null).
[17/Nov/2022:15:13:58.338339 +0100] [xxxserver/sid#557cb7f61ff8][rid#7f9a34000cd0][/wp-admin/post.php][3] Rule 557cb8066770 [id "-"][file "/etc/httpd/conf.modsecurity.d/owasp-modsecurity-crs/rules/RESPONSE-951-DATA-LEAKAGES-SQL.conf"][line "270"] - Execution error - PCRE limits exceeded (-8): (null).
[17/Nov/2022:15:13:58.341566 +0100] [xxxserver/sid#557cb7f61ff8][rid#7f9a34000cd0][/wp-admin/post.php][3] Rule 557cb8259e08 [id "-"][file "/etc/httpd/conf.modsecurity.d/owasp-modsecurity-crs/rules/RESPONSE-951-DATA-LEAKAGES-SQL.conf"][line "321"] - Execution error - PCRE limits exceeded (-8): (null).
[17/Nov/2022:15:13:58.392850 +0100] [xxxserver/sid#557cb7f61ff8][rid#7f9a34000cd0][/wp-admin/post.php][3] Rule 557cb82b0610 [id "-"][file "/etc/httpd/conf.modsecurity.d/owasp-modsecurity-crs/rules/RESPONSE-951-DATA-LEAKAGES-SQL.conf"][line "346"] - Execution error - PCRE limits exceeded (-8): (null).
[17/Nov/2022:15:13:58.405668 +0100] [xxxserver/sid#557cb7f61ff8][rid#7f9a34000cd0][/wp-admin/post.php][3] Rule 557cb82bf908 [id "-"][file "/etc/httpd/conf.modsecurity.d/owasp-modsecurity-crs/rules/RESPONSE-951-DATA-LEAKAGES-SQL.conf"][line "371"] - Execution error - PCRE limits exceeded (-8): (null).
[17/Nov/2022:15:13:58.412259 +0100] [xxxserver/sid#557cb7f61ff8][rid#7f9a34000cd0][/wp-admin/post.php][3] Rule 557cb82c6d40 [id "-"][file "/etc/httpd/conf.modsecurity.d/owasp-modsecurity-crs/rules/RESPONSE-951-DATA-LEAKAGES-SQL.conf"][line "396"] - Execution error - PCRE limits exceeded (-8): (null).
[17/Nov/2022:15:13:58.414102 +0100] [xxxserver/sid#557cb7f61ff8][rid#7f9a34000cd0][/wp-admin/post.php][3] Rule 557cb89d61b8 [id "-"][file "/etc/httpd/conf.modsecurity.d/owasp-modsecurity-crs/rules/RESPONSE-951-DATA-LEAKAGES-SQL.conf"][line "421"] - Execution error - PCRE limits exceeded (-8): (null).
[17/Nov/2022:15:13:58.415466 +0100] [xxxserver/sid#557cb7f61ff8][rid#7f9a34000cd0][/wp-admin/post.php][3] Rule 557cb7bb00a0 [id "-"][file "/etc/httpd/conf.modsecurity.d/owasp-modsecurity-crs/rules/RESPONSE-951-DATA-LEAKAGES-SQL.conf"][line "446"] - Execution error - PCRE limits exceeded (-8): (null).

Unfortunately, the PCRE limits exceeded errors can't be resolved since you've already tried with high values for your limits.
A good value for SecPcreMatchLimit and SecPcreMatchLimitRecursion for production are 500000 (500K). Higher values can lead to DoS problems. And it probably won't fix the errors.
One question: did you add both ModSecurity directives to the server-wide modsecurity.conf?

Note : This directive is not allowed inside VirtualHosts. If enabled, it must be placed in a global server-wide configuration file such as your default modsecurity.conf

Yes, both directives are loaded in modsecurity.conf which is loaded directly by httpd.conf, they are not set anywhere else, also the pcre.backtrack values were set in global php.ini and checked with phpinfo
As you can see 500K is what I have running in the first post, these are my usual values.
There is nothing that cannot be solved :) It has to have a reason that even if I go to 10.000.000 this is triggered

Because in the end that means that every other request I have is not being able to be checked

The rule is not triggered. The @rx operator against RESPONSE_BODY leads to these PCRE limits exceeded, because the response body is probably very big.
The response rules 95xxxx are running for every response.
You can exclude (tune away) the response rules for your requests, your REQUEST_URI for example, then these errors will disappear.

Hm, now programming since 1983 this seems a little off to me, how can the response body be bigger than the astronomical values that I set for pcre. Also, for what should I use this rule, I do not care about pinfo.php, this is also happening at literally every other page that is opened, so also dynamic WP pages. Should I write exceptions for all of them.
Is the request in the end checked or does this break the process, this is not clearly answered, sorry.
I will send you now all the PCRE limit messages just for a simple call, but I have to do this in pieces as github cannot handle it
[17/Nov/2022:17:28:38.300281 +0100] [xxxserver/sid#5560b8548658][rid#7f30e003de00][/pinfo.php][4] Executing operator "rx" with param "(?i:ORA-[0-9][0-9][0-9][0-9]|java\\.sql\\.SQLException|Oracle error|Oracle.*Driver|Warning.*oci_.*|Warning.*ora_.*)" against RESPONSE_BODY.
[17/Nov/2022:17:28:38.300604 +0100] [xxxserver/sid#5560b8548658][rid#7f30e003de00][/pinfo.php][3] Rule 5560b909bbd0 [id "-"][file "/etc/httpd/conf.modsecurity.d/owasp-modsecurity-crs/rules/RESPONSE-951-DATA-LEAKAGES-SQL.conf"][line "93"] - Execution error - PCRE limits exceeded (-8): (null).
[17/Nov/2022:17:28:38.313727 +0100] [xxxserver/sid#5560b8548658][rid#7f30e003de00][/pinfo.php][4] Executing operator "rx" with param "(?i:An illegal character has been found in the statement|com\\.informix\\.jdbc|Exception.*Informix)" against RESPONSE_BODY.
[17/Nov/2022:17:28:38.314243 +0100] [xxxserver/sid#5560b8548658][rid#7f30e003de00][/pinfo.php][3] Rule 5560b92b54f0 [id "-"][file "/etc/httpd/conf.modsecurity.d/owasp-modsecurity-crs/rules/RESPONSE-951-DATA-LEAKAGES-SQL.conf"][line "244"] - Execution error - PCRE limits exceeded (-8): (null).

And as there is no id I cannot remove a rule by id..., the id is "-" constantly for all these calls...

The HTTP request is checked, but not the HTTP response. The HTTP response is not checked anymore, as ModSecurity aborts the check for this response. Glad you asked, so I can respond.
Ya, honestly I did not want that thing here to escalate... :)

I still do not get it, like not at all. You see that these are all different checks in terms of "with param", so I have to exclude all 9 checks for my whole server installation, right?
Because this cannot be a page problem per se. These are checks against packages/programs that are not even installed on the server. So there can be far more coming up. Is this assumption right then so far?

I still do not get it, like not at all. You see that these are all different checks in terms of "with param", so I have to exclude all 9 checks for my whole server installation, right?

Yes, of course, I see that. And yes you have to do it. Or you can remove all 951xxx rules with a range if you don't care about SQL data leakages or errors:
SecRuleRemoveById "951100-951999"

Because this cannot be a page problem per se. These are checks against packages/programs that are not even installed on the server. So there can be far more coming up. Is this assumption right then so far?

The CRS is a general rule set that checks for PHP attacks in HTTP requests, SQLi in HTTP requests and Java errors in HTTP responses for example.
CRS does not care what application you are running, it's a general rule set. You can decide if you want to exclude rule ranges.

Ok thanks for c;larifying that so far.

CRS does not care what application you are running, it's a general rule set. You can decide if you want to exclude rule ranges.

No I cannot, this is exactly my problem here. I mean yes I can decide. But if I want my response messages to be checked I cannot decide, because I have to/must remove all the rules that break on the system, where we even don't know until now why they break exactly. Otherwise my response messages are not checked.
You might think I want to troll you, but be assured this is not the case. But there is something wrong with this.

Otherwise my response messages are not/will not be checked.

Sorry, I was not clear enough and I had to fix this in my response above. Only the rule that hits the PCRE limit is aborted, not the entire response check.
I also have PCRE limit exceeded errors in my environments, yes, that can happen. But I don't have the same rules that cause limit errors. I have less rules.

Ah ok, thanks again fro clarifying that. Then this makes this more duitable for sure. I will go on and remove all the messages one by one then as there is no other possibility if I do not want them logged and I cannot handle them with a higher pcre limit, which is the case here.
Thanks.

Yes, exactly, that's a very good summary:

... remove all the messages one by one then as there is no other possibility if I do not want them logged and I cannot handle them with a higher pcre limit, which is the case here.

Ultimately, rule exclusions or rule tuning is always a balancing act between the selective deactivation of security and a functioning application / limit errors.
I'm glad it worked for you and the limit errors are gone now.


Font sizes in em

< font size="x" > is not very good way to format font size. Maybe better would be even < span style="font-size:1em" >. You know how to change this behaviour? I know it's hard to do this with execCommand.

We did consider a "wysiwyg.css()" function - but it is a bit tricky. You have to iterate the selection and apply the style to all the textnodes.

Updated demo


Not receiving any response on purchase or subscription

Hey there, i am trying to test my InAppBilling via GooglePlay Alpha-Tester. Actually i can make a purchase,  or subscription where the Billing Service is getting startet. It tells me, that i am registered as a tester and then i "pay". My problem is now, that i don´t get any response when i purchase something. But i need to get the receiptData to store it in my Server Backend. Any ideas? Working with the test productID´s works great. When i purchase something the service starts and i "pay". I don´t receive any response in the first step. If i hit purchase again i receive the correct response i would need for my Backend:
DetailsObject -> TransactionData
.	orderId: "transactionId.android.test.purchased"
.	productId: "android.test.purchased"
.	purchaseState: "PurchasedSuccessfully"
.	purchaseTime: "Thu Jan 01 01:00:00 MEZ 1970"
.	purchaseToken: "inapp:com.inapptest:android.test.purchased"
.	receiptData:
  ⁃	developerPayload: "inapp:android.test.purchased:79e6362f-ce8e-43ce-bb07-8e62514e2960"
  ⁃	orderId: "transactionId.android.test.purchased"
  ⁃	packageName: "com.inapptest"
  ⁃	productId: "android.test.purchased"
  ⁃	purchaseState: 0
  ⁃	purchaseTime: 0
  ⁃	purchaseToken: "inapp:com.inapptest:android.test.purchased"
.	receiptSignature: ""

Note that i mean with purchase:
purchase() {
    InAppBilling.open().then(() => InAppBilling.purchase(productID))
        .then((details) => {
            resolveObject('IN_APP PURCHASE_DETAILS: ', details);
            return InAppBilling.close();
        })
        .catch((error) => {
            console.log('IN_APP PURCHASE_ERROR: ', error);
            return InAppBilling.close();
        });
}

Hi!
Just so I understand correctly, when you first try to purchase, you receive no transaction-details.
But if you hit purchase again, you do?
Is this while using the android.test.purchased static productId? Have you tested with a "real" id?

Hey.
If I use the static productID it gives me the transaction details on the second purchase. While I try the same,  just replaceing the test I'd with my real productID which I setup in the Google play account,  then I don't receive any transaction details. But the service seems to work though. I hope this is clear. I can post my outputs and later if you want.

Hi again, I got caught up with debugging this, and I think I have the reason nailed.
I am going to presume you are running a React Native version which is less than 18.0. For those versions your MainActivity most likely does not inherit from ReactActivity (which has been introduced in the later versions).
Because of this, onActivityResult in my module will not be called automatically, which in turn stops the success-callback for the purchase from being called.
Furthermore, for android.test.purchased (and other static test ids), whatever license key you put in the module will not validate with the static test id. In order to bypass this, you can use NULL license key for testing with android.test.purchased. This was not supported in the previous version of this module, but I have released v1.1.1 now, which will do so (please update).
Sooo, this is what you will need to do;

For RN 17.0 (and less), override onActivityResult in your MainActivity.java, and call mReactInstanceManager.onActivityResult:
  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        mReactInstanceManager.onActivityResult(requestCode, resultCode, data);
  }

If you want to test with android.test.purchased, send NULL in along with this in order to set the license key to NULL in MainActivity.java:
.addPackage(new InAppBillingBridgePackage(null, this))

Sorry for the problems, this does not feel like an optimal solution, but it's the best I can do. Be sure to tell me how it goes!

@cbrevik Great job! I updated React Native to 0.18 but had never upgraded my MainActivity. Your update fixed it. Thanks again and nothing to apologise :)

Good! If your MainActivity uses ReactActivity, then you will not have to override onActivityResult.
I will mark this as fixed then :+1:


Support for BitwiseAnd &, BitOr | binary operators

My parquet file contains a bitpacked flags (i32, but pretend it's u32). The 2nd bit in flags indicates whether the record is a potato or not. I would like to be able to access this from SQL.
Describe the solution you'd like
I think, in SQL, this would look like:

select sum(value) from pq where ((flags & 0b10) = 0b10);

I'd also be happy with it having a boolean output:

select sum(value) from pq where (flags & 0b10);

These operators (but not the binary literals) parse, but cannot be planned:

NotImplemented("Unsupported SQL binary operator BitwiseAnd")

This makes & a regular binary operator, like % or even +, although I wouldn't implement it for Decimal, or even signed integers, to start?
In my application I am going to be checking multiple flags, so any syntax which could be optimised would be great for me.
Postgres produces the integer output, instead of boolean.
Describe alternatives you've considered
You can fake this, to some extent, with (integer) / and %2.
You can (outside of the CLI, my favourite place to run SQL) register custom functions, like is_potato(flags).
I have also considered a custom function like bits_set(flags, "1001") -> bool? This is valuable to readability as there's no support for the 0b1001 binary literal syntax in the SQL at the moment, but its performance is bad, 'cos you end up with a long list of strings passed to your function.

&
Binary AND Operator copies a bit to the result if it exists in both operands.
(A & B) will give 12 which is 0000 1100

|
Binary OR Operator copies a bit if it exists in either operand.
(A | B) will give 61 which is 0011 1101

~
Binary Ones Complement Operator is unary and has the effect of 'flipping' bits.
(~A ) will give -61 which is 1100 0011 in 2's complement form due to a signed binary number.

<<
Binary Left Shift Operator. The left operands value is moved left by the number of bits specified by the right operand.
A << 2 will give 240 which is 1111 0000

>>
Binary Right Shift Operator. The left operands value is moved right by the number of bits specified by the right operand.
A >> 2 will give 15 which is 0000 1111

#
bitwise XOR.
A # B will give 49 which is 00110001

I have investigated the bitwise operations in the PG database.
You can follow the PG document to implement this.
@FauxFaux

If you want to take this task, it's better to give a plan for implementation.
@FauxFaux

I think this would be a fairly straightforward task of adding Operator::BitWiseAnd, and then plumbing it through the planner, starting here
https://github.com/apache/arrow-datafusion/blob/master/datafusion/src/sql/planner.rs#L1252

This is a good project for anyone who wants to learn how operators are implemented in DataFusion

I can take some tasks of this issue if you have a plan to implement it.

The only bitwise operator left to support is # -- I filed https://github.com/apache/arrow-datafusion/issues/3420 to track that and will close this one to make the current state of DataFusion clearer.
Thanks all!

Binary Ones Complement Operator is unary and has the effect of 'flipping' bits.

I am curious if the unary operator ~ has been implemented . I was unable to find any relevant implementation.

I am curious if the unary operator ~ has been implemented . I was unable to find any relevant implementation.

I would say no
DataFusion CLI v20.0.0
❯ select ~0;  🤔 Invalid statement: sql parser error: Expected an expression:, found: ~

I believe adding the bitwise ~ operator would be beneficial for the completeness of bitwise operations. Therefore, I would like to request the implementation of this operator.
Could you please provide some guidance on how I could proceed with implementing this operator? Any help or suggestions would be greatly appreciated.


Fix segv with PyTable.C

Description
Resolves #17381
Added check for size of results vector before referencing elements.
Type of change

[X] Bug fix
[ ] New feature
[ ] Documentation update
[ ] Other

How Has This Been Tested?
I ran the flatten.py query test on Windows and the cli didn't crash.
Checklist:

[X] I have followed the style guidelines of this project.~~
[X] I have performed a self-review of my own code.~~
- [ ] I have commented my code where applicable.
- [ ] I have updated the release notes.
- [ ] I have made corresponding changes to the documentation.
- [ ] I have added debugging support to my changes.
- [ ] I have added tests that prove my fix is effective or that my feature works.
- [ ] I have confirmed new and existing unit tests pass locally with my changes.
- [ ] I have added new baselines for any new tests to the repo.
- [ ] I have NOT made any changes to protocol or public interfaces in an RC branch.
[X] I have assigned reviewers (see VisIt's PR procedures for more information).~~

@cyrush, I just entered ticket #17397 to address the std::cout messaging


Pull failed warning

Setting both push and pull time to 1 minute I still get this occasionally (but nothing breaks):

Are you on the latest version?

Yeah, I just installed it today.
It's odd it happens occasionally. Maybe it has something to do with pull&push and pull happening at the same time?

What is the output of git status in the terminal?

It's all clean. So clearly the pull/add/commit/push happens successfully.

I have no problems with setting both pull and push to one minute. Now I get it. That's a normal git error message.  That happened, because the pushcommand was called directly afterwards. That's no error with this plugin,
In generally you cannot pull when pulled files are not committed in your working directory.

Um... I didn't call anything manually. My repo is pushed.
But that's not even the issue for me. It's the pop up that's annoying.
The plug-in still shows this error as a pop up even though I disabled notifications. It would be nice to disable this notification as well.

The issue does still occur? Could you run  git pull manually from the terminal? Does it work without error?
This notification is handled as an error and not as an information, why the notifications is still shown.

@drozzy please make sure that your files are backed up by other means rather than via git, and run git reset --hard and then git pull from the command line. Making your repository "clean" should resolve this issue.

Yes, I ensured that my git pull is clean and I did git reset --hard as well. I am certain my repository is clean. Yet it still happens.
I observed that this happens if I am typing something continuously, and the "obsidian git" plugin is triggered in the middle of me typing.

Do you have only auto pull enabled or auto push too? And the remote repo had no changes since the last push from Obsidian? Because I think this error can just be related to changes from the remote.

Hey @Vinzent03 I have both enabled at 3 minute intervals.
Here are my settings:

Nothing changed on the remote repo.
I'm guessing there's something weird with the combination of Push+Pull happening at the same time plus the "Pull changes before push" firing all at once. Just a hunch though.

I can reproduce. Working on it now.

I hope the new release fixes the issue. Added a promise queue so that the commands are not executed simultaneously.


fsm.trigger() not working

I wanna trigger a state change every 10 sec but it is not working..
#define WRITE_EVENT 2
while ( millis() - timer1 > 10000 ) {
Serial.print("<<< ");
Serial.print( millis()/divider );
Serial.println(" triggered stateWriteSerial");
fsm.trigger(WRITE_EVENT);
timer1 = millis();
}
setup() {
fsm.add_transition(&stateIdle, &stateWriteSerial, WRITE_EVENT,NULL );

}

You must call fsm.run_machine() at least once from setup() for fsm.trgger() to work due to the predicate in the trigger function preventing it from triggering if not initialized.
void Fsm::trigger(int event)
{
  if (m_initialized)
  {
    // Find the transition with the current state and given event.
    for (int i = 0; i < m_num_transitions; ++i)
    {
      if (m_transitions[i].state_from == m_current_state &&
          m_transitions[i].event == event)
      {
        Fsm::make_transition(&(m_transitions[i]));
        return;
      }
    }
  }
}

Calling fsm.run_machine() will set m_initialized = true
void Fsm::run_machine()
{
  // first run must exec first state "on_enter"
  if (!m_initialized)
  {
    m_initialized = true;
    if (m_current_state->on_enter != NULL)
      m_current_state->on_enter();
  }

  if (m_current_state->on_state != NULL)
    m_current_state->on_state();

  Fsm::check_timed_transitions();
}


Error 400: redirect_uri_mismatch

I set up everything correct but I still have the error below:
Access denied: The request sent by this application is invalid
You can't sign in because this app sent an invalid request. You can try again later or contact the developer about this issue. More information about this error
If you are one of the developers of this app, review the error details .
Error 400: redirect_uri_mismatch

My guess is when you created the Google application, you did not set it as a Desktop App.  See instructions here


When quickly entering TextField with KeyboardType.Password on iOS, the UI jank.

Describe the bug
When quickly entering TextField with KeyboardType.Password on iOS, the UI jank.
Affected platforms

iOS

Versions

Kotlin version*: 1.9.23
Compose Multiplatform version*: 1.6.10-beta02
OS version(s)* (required for Desktop and iOS issues): 17.4.1
Device (model or simulator for iOS issues): model

To Reproduce
Steps and/or the code snippet to reproduce the behavior:
PasswordTextfieldExample.kt
https://github.com/JetBrains/compose-multiplatform/assets/9105106/9b9208b1-5589-447b-bcf7-537ba8ed789b

Please check the following ticket on YouTrack for follow-ups to this issue. GitHub issues will be closed in the coming weeks.


nav: multiline instructions cut off with lanes

Couple hundred commits ago:
Now:

Not sure why, can't reproduce on my laptop

I noticed it's not all instructions, only this one. Let me try to find the route

So if there was a few more characters after Freeway it would add the correct spacing. But if it was just a few characters on the second line, the QWidget this layout was in wouldn't resize. https://github.com/commaai/openpilot/pull/29465 fixes this, as there's no QWidget wrapper any more.


Added oom_kill_disable and oom_score_adj support to docker_container

Description
Added oom_kill_disable and oom_score_adj support to docker_container.
https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources
https://docs.docker.com/config/containers/resource_constraints/#memory

Issue: https://github.com/chef-cookbooks/docker/issues/976

Thanks @alrf. This will get shipped in the next release and I'll make sure we pull it into chef-client when we move these resources


[stable/prometheus] Organized Templates Directory. Add ".gitignore".

Is this a new chart
No.
What this PR does / why we need it:

Organizes the templates/ directory into a clearer structure.
Adds .gitignore. Adds requirements.lock to .gitignore.

Checklist
[Place an '[x]' (no spaces) in all applicable fields. Please remove unrelated fields.]

[x] DCO signed
[x] Chart Version bumped
[x] Variables are documented in the README.md
[x] Title of the PR starts with chart name (e.g. [stable/mychartname])

/assign @zanhsieh

@Xtigyro
Thank you for the contribution.
Couple things:

How do you ensure the backward compatibility
Naming rule is still wordy. For example, prometheus/templates/alertmanager-configmap.yaml → .prometheus/configmaps/alertmanager-configmap.yaml, why moving into its functional directory (configmaps) but still keep suffix (-configmap) ?

@zanhsieh

* Naming rule is still wordy. For example, prometheus/templates/alertmanager-configmap.yaml → .prometheus/configmaps/alertmanager-configmap.yaml, why moving into its functional directory (configmaps) but still keep suffix (-configmap) ?

My initial idea was only to create a clearer dir structure but this is even better - thanks! Done.

* How do you ensure the backward compatibility

Aren't just the source filenames changing (which are put as first-line comments in the rendered resources) - which does not result to any actual changes of the deployment?

@Xtigyro
Let's give it a try.
/ok-to-test

/retest

@zanhsieh It appears it times out without a good reason - probably that's an internal infra temp issue?

/retest

/retest

@zanhsieh Yeah - it should have been a temp infra issue. Re-run it today - OK.

/lgtm

/retest

@zanhsieh I'll merge master and bump again the chart version - it seems another PR has gone in, in the meantime.

@zanhsieh @gianrubio Done.

/lgtm


feat: migrate to null safety

"BOLL" slide to the last exception
════════ Exception caught by rendering library ═════════════════════════════════
Null check operator used on a null value
The relevant error-causing widget was
CustomPaint
../lib/k_chart_widget.dart:217


Image segmentation using custom neural network model with Tensorflow

Currently two different network architectures have been used for object segmentation: Cellpose and RDCNet. As a minimal working example, we should be able to use a pre-trained model from each of these architectures and use it for prediction of label maps. Important to note that Cellpose is using pytorch, whereas RDCNet utilizes Tensorflow.
Cellpose should work by installing it from the repository above. For RDCNet, we have usually used it via ISIT.
The input is the reading of the zarr file in such a way that the images match the images used for training and applying the prediction model on them. The output are object labels which are defined as regions which contain information of where they should be located within the field grid. Each region comprises of a segmented object plus a certain bounding box surrounding it.
Currently the models mostly used with RDCNet rely on object segmentation of MIP projections of each well/overview.

This has been covered in the (private) RDCNet task at FMI now